我有一个带有CASE的SELECT语句,它使用JSON函数,在升级到PostgreSQL 10时停止工作。
SELECT
CASE
WHEN type = 'a' THEN data #>> '{key_a,0}'
WHEN type = 'b' THEN data #>> '{key_a,0,key_b,0}'
WHEN type = 'c' THEN jsonb_object_keys(data #> '{key_c,key_d}')
ELSE NULL
END AS foo,
CASE
WHEN type = 'a' THEN jsonb_array_elements_text(data -> 'key_e')
WHEN type = 'b' THEN data #>> '{key_f,0,key_g}'
ELSE NULL
END AS bar
错误:CASE中不允许使用set-returns函数
提示:您可以将set-returns函数移动到LATERAL FROM项中。
我不明白如何使用LATERAL FROM是另一种选择。事实上,我不完全理解为什么使用LATERAL,即使在阅读the PG docs (section 7.2.1.5)时也是如此。
有什么想法如何将此声明转换为与PG 10一起使用?
只要这些set-returns函数都不会返回多行,就可以将它们放在子查询中以绕过限制:
SELECT
CASE
WHEN type = 'a' THEN data #>> '{key_a,0}'
WHEN type = 'b' THEN data #>> '{key_a,0,key_b,0}'
WHEN type = 'c' THEN (SELECT jsonb_object_keys(data #> '{key_c,key_d}'))
ELSE NULL
END AS foo,
CASE
WHEN type = 'a' THEN (SELECT jsonb_array_elements_text(data -> 'key_e'))
WHEN type = 'b' THEN data #>> '{key_f,0,key_g}'
ELSE NULL
END AS bar