【问题标题】:Postgres JSON Query within list列表中的 Postgres JSON 查询
【发布时间】:2015-08-11 04:58:36
【问题描述】:

我在匹配表中有以下数据:

{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}

{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}

最终我想获得一个独特团队名称的列表。

This Question 之后,我一直在尝试使用以下方法访问团队名称属性:

SELECT json_array_elements(match->>'Teams') FROM matches

返回

ERROR: function json_array_elements(text) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 1560

我也试过 json_array_elements(match->>'Teams'::json) 和 json_array_elements(to_json(match->>'Teams')) 无济于事。

但是下面的查询

SELECT match->>'Teams' FROM matches;

返回

"[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}]"
"[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}]"

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    ->> 运算符为您提供text 的结果,但您希望它保持为json。使用->,它会为您提供json 值。

    参考:http://www.postgresql.org/docs/9.4/static/functions-json.html

    我相信json_array_elements(match->>'Teams'::json) 上的操作顺序在运行->> 之前会将Teams 转换为jsonjson_array_elements((match->>'Teams')::json) 应该可以,但只是 -> 的迂回版本。

    to_json(match->>'Teams') 转换为text,然后将该文本作为json 对象提供给您。它不会将text 解析回json

    【讨论】:

    • 哇,这么简单的解决方法。有什么理由使用文本版本吗? (->> 结束 ->)
    • 有时您需要文本,有时您需要更多 JSON,这完全取决于您的用例。当涉及NULL 时,会有一些不同的行为 - 这是demo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2017-06-01
    • 2017-01-01
    • 2014-09-23
    • 2018-04-13
    • 2022-01-07
    相关资源
    最近更新 更多