2017-02-18 24 views

回答

3

限制條件是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; 

或者你可以使用一個文件類型像jsonhstorexml包含可變數量列...

注意,你得到一個結果列無論哪種方式,變通辦法只需包含一個可變有效載荷 - 可以在下一步中分解。

+0

非常全面的謝謝! –

0

不,你不能因爲列的選擇是靜態的。如果您真的想根據某些條件動態選擇列,請考慮爲此目的構建一個dynamic query

+1

如果給'x'輸入參數,動態SQL只能幫助解決這個問題,所以我們可以根據它執行不同的查詢。如果'x'是一個表列,那麼動態查詢就無法做到。 SQL不允許在結果中使用不同的類型。除此之外,你的鏈接是Postgres 9.1的ecpg。更有用的資源將是當前版本的plpgsql:https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN –

相關問題