SQL CASE可以在WHEN子句中返回不同数量的列吗?

问题描述:

有没有办法在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; 

或者你可以使用一个文件类型像jsonhstorexml包含可变数量列...

注意,你得到一个结果列无论哪种方式,变通办法只需包含一个可变有效载荷 - 可以在下一步中分解。

+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 –