代码之家  ›  专栏  ›  技术社区  ›  Dennis

PostgreSQL错误:JSON集合返回函数的情况

  •  1
  • Dennis  · 技术社区  · 7 年前

    我有一个SELECT语句,其中一个CASE使用了JSON函数,当升级到postgresql10时,它就停止工作了。

    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
    

    错误:在这种情况下不允许设置返回函数

    提示:您可以将set returning函数移到一个横向FROM项中。

    我不明白怎么用侧方从是一个替代品。事实上,我不完全明白为什么会使用侧边,即使在阅读时 the PG docs (section 7.2.1.5) .

    你知道如何将这句话转换成与第10页一起使用吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   404 Aniket Jha    7 年前

    只要这些集合返回函数中没有一个返回多行,就可以将它们放入子查询中以绕过限制:

    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
    
    推荐文章