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;
或者你可以使用一个文件类型像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 –
非常全面的谢谢! –