我有一个带有使用JSON函数的CASE的SELECT语句,该语句在升级到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中不允许使用返回设置的功能
提示:您也许可以将返回设置的函数移至LATERAL FROM项中。
我不知道如何使用LATERAL FROM。实际上,即使阅读the PG docs (section 7.2.1.5),我也不完全理解为什么要使用LATERAL。
有什么想法可以将该语句转换为适用于PG 10?
答案 0 :(得分:2)
只要这些返回集合的函数都不会返回多行,就可以将它们放在子查询中以解决限制:
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