【问题标题】:Find rows based on nested key in jsonb array根据 jsonb 数组中的嵌套键查找行
【发布时间】:2019-10-14 22:02:50
【问题描述】:

我在 Postgres 9.6 中有一个 jsonb 列,其中包含以下形式的 JSON 数组:

[
  {
    "courses": { "course-1": { "graduated": false }, "course-5": { "graduated": true } }
  },
  {
    "courses": { "course-6": { "graduated": false } }
  }
]

我想通过一个查询找到所有注册course-1course-12 的用户。也就是说,对于 jsonb 数组中的任何条目,courses 对象中具有 course-1course-12 的用户。

我已经尝试了很多类似以下的方法,当然这不起作用:

select enrollment_info from users where (enrollment_info @> '["courses" ?| array['course-1', 'course-12']]')

关于如何解决此问题的任何建议?谢谢!

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    您可以使用jsonb_array_elements 取消嵌套数组,然后检查是否存在至少一个搜索到的键:

    select enrollment_info
    from users,
    jsonb_array_elements(enrollment_info) courses
    where 
        courses->'courses'->'course-1' is not null
        or courses->'courses'->'course-12' is not null
    

    Demo on DB Fiddle

    with users as (
        select 
        '[ 
            { "courses": { "course-1": { "graduated": false }, "course-5": { "graduated": true } }},
            { "courses": { "course-6": { "graduated": false } } }
        ]'::jsonb enrollment_info
        union all select 
        '[ 
            { "courses": { "course-12": { "graduated": false }, "course-5": { "graduated": true } }}
        ]'::jsonb
        union all select 
        '[ 
            { "courses": { "course-4": { "graduated": false } }}
        ]'::jsonb
    )
    select enrollment_info
    from users,
    jsonb_array_elements(enrollment_info) courses
    where 
        courses->'courses'->'course-1' is not null
        or courses->'courses'->'course-12' is not null
    
    |招生信息 | | :------------------------------------------------ -------------------------------------------------- ------------------------------------------- | | [{“课程”:{“课程1”:{“毕业”:假},“课程5”:{“毕业”:真}}},{“课程”:{“课程6”:{ “毕业”:假}}}] | | [{“课程”:{“课程5”:{“毕业”:真},“课程12”:{“毕业”:假}}}] |

    前两个数组匹配,因为它们分别包含course-1course-12。第三个数组不匹配。

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 2017-03-28
      • 2021-02-14
      • 2013-03-09
      • 2015-05-20
      • 2017-11-26
      • 2014-01-02
      • 2017-12-24
      相关资源
      最近更新 更多