根据 jsonb 数组中的嵌套键查找行
Find rows based on nested key in jsonb array
我在 Postgres 9.6 中有一个 jsonb 列,其中包含 JSON 以下形式的数组:
[
{
"courses": { "course-1": { "graduated": false }, "course-5": { "graduated": true } }
},
{
"courses": { "course-6": { "graduated": false } }
}
]
我想通过单个查询查找已注册 course-1
或 course-12
的所有用户。也就是说,对于 jsonb
数组中的任何条目,在 courses
对象中具有 course-1
或 course-12
的用户。
我已经尝试了很多类似下面的东西,当然这不起作用:
select enrollment_info from users where (enrollment_info @> '["courses" ?| array['course-1', 'course-12']]')
关于如何解决这个问题有什么建议吗?谢谢!
您可以使用 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
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
| enrollment_info |
| :---------------------------------------------------------------------------------------------------------------------------------- |
| [{"courses": {"course-1": {"graduated": false}, "course-5": {"graduated": true}}}, {"courses": {"course-6": {"graduated": false}}}] |
| [{"courses": {"course-5": {"graduated": true}, "course-12": {"graduated": false}}}] |
前两个数组匹配,因为它们分别包含 course-1
和 course-12
。第三个数组不匹配。
我在 Postgres 9.6 中有一个 jsonb 列,其中包含 JSON 以下形式的数组:
[
{
"courses": { "course-1": { "graduated": false }, "course-5": { "graduated": true } }
},
{
"courses": { "course-6": { "graduated": false } }
}
]
我想通过单个查询查找已注册 course-1
或 course-12
的所有用户。也就是说,对于 jsonb
数组中的任何条目,在 courses
对象中具有 course-1
或 course-12
的用户。
我已经尝试了很多类似下面的东西,当然这不起作用:
select enrollment_info from users where (enrollment_info @> '["courses" ?| array['course-1', 'course-12']]')
关于如何解决这个问题有什么建议吗?谢谢!
您可以使用 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
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
| enrollment_info | | :---------------------------------------------------------------------------------------------------------------------------------- | | [{"courses": {"course-1": {"graduated": false}, "course-5": {"graduated": true}}}, {"courses": {"course-6": {"graduated": false}}}] | | [{"courses": {"course-5": {"graduated": true}, "course-12": {"graduated": false}}}] |
前两个数组匹配,因为它们分别包含 course-1
和 course-12
。第三个数组不匹配。