【问题标题】:Postgres: Select all fields where json field array contains a particular value?Postgres:选择json字段数组包含特定值的所有字段?
【发布时间】:2015-05-14 08:10:27
【问题描述】:

假设我有一个 userscompanies 表,其中 1 个用户可以为多家公司工作。在这种情况下,我使用 JSON 字段对其进行建模。

users
- id: PK
- jobs: json

示例jobs 字段:[{"company_id": 1, "title": "Engineer" }, {"company_id": 2, "title": "Accountant"}]

给定一个公司 ID,有没有办法运行 1 个 SQL 查询(Postgres 9.4)来提取在该公司工作过的所有用户 ID?比如:

select id from users where map(jobs, "company_id") contains <?>

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    可能不是最好的方法,但这是可行的:

    SELECT id FROM
      (SELECT id, json_array_elements(jobs) as a FROM table) b
    WHERE a->>'company_id'='1';
    

    【讨论】:

    • 谢谢!这行得通。我接受这一点,因为这也适用于 json 字段类型。 @jgm 的另一个答案也有效,但它要求您的字段为 jsonb
    【解决方案2】:

    这应该可以解决问题:

    SELECT id FROM users WHERE jobs @>'[{"company_id":1}]'
    

    【讨论】:

    • 请注意:使用它需要jsonb 数据类型,不适用于json
    • 是的,但如果你在 9.4 上,你真的应该使用 jsonb,除非你有特定的要求排除它。
    • 是的,这就是为什么只是一个注释。当然,对于一次性对性能不敏感的查询,总是可以将 json 转换为 jsonb。
    猜你喜欢
    • 2023-03-28
    • 2012-03-20
    • 2020-01-23
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多