有沒有辦法在SELECT
的不同WHEN
條款中有不同的列數CASE
聲明?SQL CASE可以在WHEN子句中返回不同數量的列嗎?
例如
SELECT
CASE x
WHEN is y THEN show me 1 column
WHEN is z THEN show me 3 columns
END
FROM i;
有沒有辦法在SELECT
的不同WHEN
條款中有不同的列數CASE
聲明?SQL CASE可以在WHEN子句中返回不同數量的列嗎?
例如
SELECT
CASE x
WHEN is y THEN show me 1 column
WHEN is z THEN show me 3 columns
END
FROM i;
限制條件是CASE
表達式的所有分支必須解析爲相同的數據類型。 The manual:
所有結果表達式的數據的類型必須能夠轉換到一個單一 輸出類型。有關更多詳情,請參閱Section 10.5。
如果所有輸出列有兼容的數據類型,你可以使用一個數組包含可變數量的列(導致同一陣列類型)。像:
SELECT CASE x
WHEN 1 THEN ARRAY[y]
WHEN 2 THEN ARRAY[x,y,z]
-- no ELSE defaults to NULL
END AS my_result_array
FROM tbl;
如果沒有,你可以投放到您選擇的常見元素類型(text
將是安全默認值):
SELECT CASE x
WHEN 1 THEN ARRAY[x::text]
WHEN 2 THEN ARRAY[x::text, y::text, z::text]
END AS my_result_array
FROM tbl;
或者,使它成爲工作異構數據類型,您可以使用複合類型(行類型)並填充NULL值。輸出欄的名稱,編號和類型是固定的,並且必須涵蓋所有可能的結果組合。
CREATE TYPE foo (a int, b text, c date);
SELECT CASE x
WHEN 1 THEN (x, NULL, NULL)::foo
WHEN 2 THEN (x, y, z)::foo
END AS my_result_array
FROM tbl;
或者你可以使用一個文件類型像json
,hstore
或xml
包含可變數量列...
注意,你得到一個結果列無論哪種方式,變通辦法只需包含一個可變有效載荷 - 可以在下一步中分解。
不,你不能因爲列的選擇是靜態的。如果您真的想根據某些條件動態選擇列,請考慮爲此目的構建一個dynamic query
。
如果給'x'輸入參數,動態SQL只能幫助解決這個問題,所以我們可以根據它執行不同的查詢。如果'x'是一個表列,那麼動態查詢就無法做到。 SQL不允許在結果中使用不同的類型。除此之外,你的鏈接是Postgres 9.1的ecpg。更有用的資源將是當前版本的plpgsql:https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN –
非常全面的謝謝! –