【问题标题】:Using JSON Function with PostgreSQL Subqueries将 JSON 函数与 PostgreSQL 子查询一起使用
【发布时间】:2021-08-09 21:40:54
【问题描述】:

这是previous question 的后续报道。理解 PostgreSQL 查询中涉及 JSON 函数时返回的内容会导致难以实施看似有效的解决方案。

下面的查询运行完成,并按预期返回一列三行。

SELECT x.y->'c' as c
from json_array_elements('[
                            {"c": "str1"}, 
                            {"c": "str2"},
                            {"c": "str3"}
                           ]') x(y)

但是,如果我尝试将上述内容作为子查询运行,无论是作为 EXISTS 语句的一部分还是作为 JOIN,都会出现错误。这是JOIN版本...

SELECT fldc
FROM table t
LEFT JOIN (SELECT x.y->'c' as c
           from json_array_elements('[
                            {"c": "str1"}, 
                            {"c": "str2"},
                            {"c": "str3"}
                           ]') x(y)) as z
ON z.c = t.fldc
LIMIT 100

子查询的SELECT语句中带有单箭头,如上图,错误信息为ERROR: operator does not exist: json = character varying Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

带有双箭头,即SELECT x.y->>'c' as c,错误信息为ERROR: Function 'JSON_ARRAY_ELEMENTS' is not supported in this context.

(PostgreSQL 是从 Dataiku 的 Data-Science Studio (DSS) 运行的,所以我相信这些错误消息是由 DSS 生成的,而不是直接来自 PostgreSQL)。

我认为一旦生成了 SELECT 语句的输出,它就像任何其他 SELECT 语句的输出一样,即如果子查询可以作为独立查询运行,它应该可以顺利地适应更大的查询.任何人都可以就这里发生的事情的实践和理论提供帮助,以及是否需要和/或预期额外的数据转换或转换?

【问题讨论】:

    标签: sql json postgresql dataiku


    【解决方案1】:

    你不能直接比较 json 和 text。首先将 json 转换为文本

    SELECT fldc
    FROM (
     select '"123"' fldc
     )t
    LEFT JOIN (SELECT(x.y->'c')::varchar(100) as c
               from json_array_elements('[
                                {"c": "str1"}, 
                                {"c": "str2"},
                                {"c": "str3"}
                               ]') x(y)) as z
    ON z.c = t.fldc
    

    db<>fiddle

    【讨论】:

    • 不幸的是,上面的查询导致与以前相同的行为。子查询作为独立查询可以正常工作,但尝试将其用作子查询会生成错误消息ERROR: Function 'JSON_ARRAY_ELEMENTS' is not supported in this context.
    • 添加了 dbfiddle。
    • 一切都指向我正在使用的 PostgreSQL/JSON 的实现方向,但我不明白什么样的限制会导致独立工作的查询成为不能用作子查询。
    【解决方案2】:

    您需要使用-&gt;&gt; 而不是-&gt; 来返回text 值而不是json 值。您实际上也不需要子查询。

    SELECT fldc
    FROM table t
    LEFT JOIN json_array_elements('[
                                {"c": "str1"}, 
                                {"c": "str2"},
                                {"c": "str3"}
                               ]') x(y)
        ON t.fldc = x.y->>'c'
    LIMIT 100
    

    Online example

    【讨论】:

    • 建议的解决方案导致错误消息ERROR: Function 'JSON_ARRAY_ELEMENTS' is not supported in this context
    • 嗯,这不是 Postgres 错误消息。
    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 2018-04-28
    • 2023-04-09
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多