是,終於有:) SQL標準2016定義Polymorphic Table Functions
SQL 2016引入了不需要指定結果類型前期多態表函數(PTF)。相反,他們可以提供一個在運行時確定返回類型的描述組件過程。 PTF的作者和PTF的用戶都不需要提前申報退回的專欄。
SQL:2016描述的PTF在任何測試的數據庫中都不可用。有興趣的讀者可參考ISO發佈的免費技術報告「SQL中的多態表函數」。以下是一些的報告中所討論的實施例中:
CSVreader,其內容CVS文件的標題行來確定返回的列數和名稱
樞軸(實際上逆透視) ,果然列組成列(例如:PHONETYPE,PHONENUMBER) - 我:沒有更多harcoded串:)
TopNplus,其穿過每個分區和一個額外的行N行與剩餘行
的總計
Oracle 18c
實現這一機制。 18c Skip_col Polymorphic Table Function Example Oracle Live SQL和Skip_col Polymorphic Table Function Example
這個例子說明了如何基於名稱/特定數據類型跳過數據:
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;
和身體:
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;
而且樣品用量:
-- 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;
我強烈建議閱讀整個示例(創建獨立功能離子而不是軟件包調用)。
您可以輕鬆地重載skip方法,例如:跳過不以特定前綴/後綴開始/結束的列。
在SQL Server中,EXCEPT關鍵字確實存在,但它並不打算在您的問題中使用。它在兩個結果集之間執行DIFFERENCE UNION,以給出第一個結果集中存在但不存在於第二個結果集中的「記錄」的結果集。 – 2009-02-02 17:42:36
它吮吸它不存在。 – VISQL 2012-06-29 23:51:35
可能重複的[SQL使用SELECT \ * \ [列columnA \] FROM tableA除外列](http://stackoverflow.com/questions/729197/sql-exclude-a-column-using-select-except- columna-from-tablea) – billinkc 2015-03-31 21:01:38