1

我有一个带有使用 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 是一种替代方法。事实上,即使阅读PG 文档(第 7.2.1.5 节) ,我也不完全理解为什么要使用 LATERAL 。

任何想法如何将此语句转换为与 PG 10 一起使用?

4

1 回答 1

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
于 2018-09-18T11:06:30.173 回答