Sí, finalmente hay :) estándar SQL 2016 define Polymorphic Table Functions
SQL: 2016 introduce funciones de tabla polimórficos (PTF) que no necesitan especificar el tipo de resultado por adelantado. En cambio, pueden proporcionar un procedimiento de componente de descripción que determina el tipo de devolución en tiempo de ejecución. Ni el autor del PTF ni el usuario del PTF necesitan declarar las columnas devueltas por adelantado.
Los PTF descritos por SQL: 2016 aún no están disponibles en ninguna base de datos probada.10 Los lectores interesados pueden consultar el informe técnico gratuito "Funciones de tabla polimórficas en SQL" publicado por ISO. Los siguientes son algunos de los ejemplos analizados en el informe:
CSVReader, que lee el encabezamiento de un archivo CVS para determinar el número y los nombres de las columnas de retorno
pivote (en realidad UNPIVOT) , que convierte los grupos de columnas en filas (ejemplo: phonetype, del número de teléfono) - me: no hay cuerdas más harcoded :)
TopNplus, que pasa a través de N filas por partición y una fila adicional con los totales de las filas restantes
Oracle 18c
implementa este mecanismo. 18c Skip_col Polymorphic Table Function Example Oracle Live SQL y Skip_col Polymorphic Table Function Example
Este ejemplo muestra cómo omitir los datos en función del nombre/tipo de datos específico:
CREATE PACKAGE skip_col_pkg AS
-- OVERLOAD 1: Skip by name
FUNCTION skip_col(tab TABLE, col columns)
RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;
FUNCTION describe(tab IN OUT dbms_tf.table_t,
col dbms_tf.columns_t)
RETURN dbms_tf.describe_t;
-- OVERLOAD 2: Skip by type --
FUNCTION skip_col(tab TABLE,
type_name VARCHAR2,
flip VARCHAR2 DEFAULT 'False')
RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;
FUNCTION describe(tab IN OUT dbms_tf.table_t,
type_name VARCHAR2,
flip VARCHAR2 DEFAULT 'False')
RETURN dbms_tf.describe_t;
END skip_col_pkg;
y cuerpo:
CREATE PACKAGE BODY skip_col_pkg AS
/* OVERLOAD 1: Skip by name
* NAME: skip_col_pkg.skip_col
* ALIAS: skip_col_by_name
*
* PARAMETERS:
* tab - The input table
* col - The name of the columns to drop from the output
*
* DESCRIPTION:
* This PTF removes all the input columns listed in col from the output
* of the PTF.
*/
FUNCTION describe(tab IN OUT dbms_tf.table_t,
col dbms_tf.columns_t)
RETURN dbms_tf.describe_t
AS
new_cols dbms_tf.columns_new_t;
col_id PLS_INTEGER := 1;
BEGIN
FOR i IN 1 .. tab.column.count() LOOP
FOR j IN 1 .. col.count() LOOP
tab.column(i).pass_through := tab.column(i).description.name != col(j);
EXIT WHEN NOT tab.column(i).pass_through;
END LOOP;
END LOOP;
RETURN NULL;
END;
/* OVERLOAD 2: Skip by type
* NAME: skip_col_pkg.skip_col
* ALIAS: skip_col_by_type
*
* PARAMETERS:
* tab - Input table
* type_name - A string representing the type of columns to skip
* flip - 'False' [default] => Match columns with given type_name
* otherwise => Ignore columns with given type_name
*
* DESCRIPTION:
* This PTF removes the given type of columns from the given table.
*/
FUNCTION describe(tab IN OUT dbms_tf.table_t,
type_name VARCHAR2,
flip VARCHAR2 DEFAULT 'False')
RETURN dbms_tf.describe_t
AS
typ CONSTANT VARCHAR2(1024) := upper(trim(type_name));
BEGIN
FOR i IN 1 .. tab.column.count() LOOP
tab.column(i).pass_through :=
CASE upper(substr(flip,1,1))
WHEN 'F' THEN dbms_tf.column_type_name(tab.column(i).description)
!=typ
ELSE dbms_tf.column_type_name(tab.column(i).description)
=typ
END /* case */;
END LOOP;
RETURN NULL;
END;
END skip_col_pkg;
Y muestra de uso:
-- skip number cols
SELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number');
-- only number cols
SELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number', flip => 'True')
-- skip defined columns
SELECT *
FROM skip_col_pkg.skip_col(scott.emp, columns(comm, hiredate, mgr))
WHERE deptno = 20;
I recomiendo leer todo el ejemplo (creando una función independiente) iones en lugar de llamadas de paquete).
Podría sobrecargar fácilmente el método de omisión, por ejemplo: omita las columnas que no comienzan/finalizan con un prefijo/sufijo específico.
La palabra clave EXCEPT existe en SQL Server, aunque no está destinada a usarse como le gustaría en su pregunta. Realiza una UNIÓN DE DIFERENCIA entre dos conjuntos de resultados para proporcionarle un conjunto de resultados de "registros" que existen en el primer conjunto de resultados pero que no existen en el segundo conjunto de resultados –
. Apesta que esto no exista. – VISQL
posible duplicado de [SQL excluye una columna usando SELECT \ * \ [excepto columnA \] FROM tableA?] (Http://stackoverflow.com/questions/729197/sql-exclude-a-column-using-select-except- columna-from-tablea) – billinkc