PostgreSQL错误:具有JSON集返回功能的CASE

时间:2018-09-18 10:13:46

标签: postgresql case postgresql-10 lateral-join

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

1 个答案:

答案 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