PostgreSQL错误:带有JSON集返回函数的CASE

问题描述 投票:1回答:1

我有一个带有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一起使用?

postgresql case postgresql-10 lateral-join
1个回答
2
投票

只要这些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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.