如何在postgres中查询嵌套json中的对象
How to query objects in nested json in postgres
假设我有 table 称为 users
,jsonb
列称为 attrs
,其值如下:
{
"uuid5": {
"label": "Email",
"value": "example@test.com.tw"
},
"uuid6": {
"label": "Last Name ",
"value": "Yang"
}
}
这里是一行:
"attrs": { "uuid5": { "label": "Email", "value": "example@test.com.tw" }, "uuid6": { "label": "Last Name ", "value": "Yang" }
如您所见,有 uniq 键 uuid5
、uuid6
等等。
如何获取标签 = 'Email' 且值 = 'example@test.com.tw' 的用户?
在postgres docs
about json functions there is a function called jsonb_each
其中returns组JSON对象key/value对。但我找不到基于此编写查询的方法。
您需要 jsonb_each
遍历 attrs 列中的所有条目。它将 return key/value 对,其中键是 uuid
,条目是您要检查的实际 JSON 结构。您可以将其与 EXISTS 条件结合使用:
select u.*
from users u
where exists (select *
from jsonb_each(u.attrs) as t(uid,entry)
where t.entry ->> 'label' = 'Email'
and t.entry ->> 'value' = 'example@test.com.tw')
假设我有 table 称为 users
,jsonb
列称为 attrs
,其值如下:
{
"uuid5": {
"label": "Email",
"value": "example@test.com.tw"
},
"uuid6": {
"label": "Last Name ",
"value": "Yang"
}
}
这里是一行:
"attrs": { "uuid5": { "label": "Email", "value": "example@test.com.tw" }, "uuid6": { "label": "Last Name ", "value": "Yang" }
如您所见,有 uniq 键 uuid5
、uuid6
等等。
如何获取标签 = 'Email' 且值 = 'example@test.com.tw' 的用户?
在postgres docs
about json functions there is a function called jsonb_each
其中returns组JSON对象key/value对。但我找不到基于此编写查询的方法。
您需要 jsonb_each
遍历 attrs 列中的所有条目。它将 return key/value 对,其中键是 uuid
,条目是您要检查的实际 JSON 结构。您可以将其与 EXISTS 条件结合使用:
select u.*
from users u
where exists (select *
from jsonb_each(u.attrs) as t(uid,entry)
where t.entry ->> 'label' = 'Email'
and t.entry ->> 'value' = 'example@test.com.tw')