【问题标题】:PostgreSQL error: CASE with JSON set-returning functionsPostgreSQL 错误:带有 JSON 集合返回函数的 CASE
【发布时间】:2019-02-22 08:27:37
【问题描述】:

我有一个带有使用 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 来替代。事实上,我并不完全理解为什么会使用 LATERAL,即使在阅读 the PG docs (section 7.2.1.5) 时也是如此。

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

【问题讨论】:

  • 只要这些函数都不会返回超过 1 行(只有您会根据您的数据知道),您可以将它们放在子选择中:THEN (SELECT jsonb_object_keys(data #> '{key_c,key_d}'))跨度>
  • @eurotrash 适用于我的情况,谢谢!如果您将评论移至答案,我很乐意接受。

标签: postgresql case postgresql-10 lateral-join


【解决方案1】:

只要这些返回集合的函数都不会返回超过一行,您可以将它们放在子查询中以绕过限制:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2016-06-01
    • 2021-12-25
    相关资源
    最近更新 更多