写入查询以在json记录中搜索,在postgreSQL中的另一个json中

时间:2015-09-09 10:22:10

标签: json database postgresql

我有一张桌子记录了每天的比赛。 TEAMS表包含一个包含json行的列,每个json字符串也包含另一个,如下所示:

---------------------------------------------------------------------
| id | doc                                                          |
---------------------------------------------------------------------
| 1  | {'team1':{'num':3, 'players':{'bob', 'eli', 'jack'}, 'color':'red'},
        'team2':{'num':3, 'players':{'a', 'eli', 'x'}, 'color':'blue'}}

这表示team1和team2在一天中有一场比赛。 我可以编写一个查询来检索所有具有“eli”的记录吗?作为球员? 谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

陈旧的问题,当然,但现在有了更好的答案。

有一个简单的版本,你不关心顶级键,只关心顶级值:

select json_path_query(
    doc, 
    '$.* ? (@.players[*] == $player)', 
    '{"player": "eli"}'
) from TEAMS

如果您想要顶级密钥,我没有不涉及转换和/或扩展的好建议。

select json_path_query(
    (team).value, 
    '$ ? (@.players[*] == $player)', 
    '{"player": "eli"}'
) from (
    select json_each(doc) as team from TEAMS
) schedule

由于这是一个 XY 问题,绝对是,您可能想知道 eli 的兄弟“ERROR:ROOT”当天是否也玩了。您始终可以将第三个参数的值数组传递给 json_path_query(),如下所示:

select json_path_query(
    doc,
    '$.* ? (@.players[*] == $player[*])',
    '{"player": ["eli","ERROR:ROOT"]}'
) from TEAMS

哦!这提出了一个非常好的可能性。假设您有一个团队,并且您想知道这些球员中的其他任何一天都在哪一天。你可能会这样做:

select json_path_query(
    doc,
    '$.* ? (@.players[*] = $players[*])',
    '{"num":3, "players": ["a", "eli", "x"], "color":"blue"'
) from TEAMS

如果您想了解更多信息,PostgreSQL 文档内容广泛但非常详细。那里有很多很棒的例子,既有关于 JSON 数据类型和 JSONpath 的页面,也有关于 JSON 函数的页面。

JSON 数据类型:https://www.postgresql.org/docs/13/datatype-json.html JSON 函数:https://www.postgresql.org/docs/13/functions-json.html