PostgreSQL error: CASE with JSON set-returning functions

PostgreSQL error: CASE with JSON set-returning functions

我有一个 SELECT 语句和一个使用 JSON 函数的 CASE,它在升级到 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

ERROR: set-returning functions are not allowed in CASE

Hint: You might be able to move the set-returning function into a LATERAL FROM item.

我不明白如何使用 LATERAL FROM 作为替代方法。事实上,我不完全理解为什么会使用 LATERAL,即使在阅读 the PG docs (section 7.2.1.5).

时也是如此

知道如何将此语句转换为适用于 PG 10 吗?

只要那些 set-returning 函数中的 none 会 return 多行,您可以将它们放在子查询中以绕过限制:

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