【问题标题】:Querying data within JSON array data field查询 JSON 数组数据字段中的数据
【发布时间】:2014-03-07 15:56:35
【问题描述】:

目前第一次在 postgres 9.3 中使用 JSON 字段,我在查询数组时遇到了一些困难。

JSON 数组数据类型的字段称为“accounts”,一些示例数据如下

[{name: "foo", account_id: "123"}, {name: "bar", account_id: "321"}]

例如,我希望能够找到拥有 account_id 123 的公司的 ID。我目前遇到问题的查询如下:

select id from companies where json_array_elements(accounts)->>'account_id' = '123'

这会导致错误:

WHERE 的参数不能返回一个集合

【问题讨论】:

  • 我猜你的意图更像是“如果 any of 元素有一个 account_id123 然后返回相应的公司 ID i>" ... ?.

标签: sql json postgresql psql


【解决方案1】:

json_array_elements(...) 返回一个集合,将->>= 应用于该集合的结果也是如此。观察:

regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
 ?column? 
----------
 t
 f
(2 rows)

您希望只能编写'123' = ANY (...),但不幸的是,如果没有数组输入,则不支持。令人惊讶的是,'123' IN (...) 也不是,我认为我们必须解决这个问题。

所以,我会使用LATERAL。这是一种方法,如果有多个匹配项,它将多次返回公司 ID:

CREATE TABLE company AS SELECT 1 AS id, '[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]'::json AS accounts;

SELECT id 
FROM company c,
LATERAL json_array_elements(c.accounts) acc 
WHERE acc ->> 'account_id' = '123';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2020-08-04
    • 2017-04-03
    • 2023-02-20
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多