【发布时间】:2019-02-22 08:27:37
【问题描述】:
我有一个带有使用 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 中不允许设置返回函数
提示:您也许可以将 set-returning 函数移动到 LATERAL FROM 项中。
我不明白如何使用 LATERAL FROM 来替代。事实上,我并不完全理解为什么会使用 LATERAL,即使在阅读 the PG docs (section 7.2.1.5) 时也是如此。
任何想法如何将此语句转换为与 PG 10 一起使用?
【问题讨论】:
-
只要这些函数都不会返回超过 1 行(只有您会根据您的数据知道),您可以将它们放在子选择中:
THEN (SELECT jsonb_object_keys(data #> '{key_c,key_d}'))跨度> -
@eurotrash 适用于我的情况,谢谢!如果您将评论移至答案,我很乐意接受。
标签: postgresql case postgresql-10 lateral-join