[英]Postgres - JSONB - Nested Columns - Query Nested Jsonb array column
我有一个具有以下结构的表 -
Column Name | Data Type
--------------------------
user_id | uuid
profile | jsonb
一个示例配置文件字段将类似于 -
{ "data": { "races": [ "white", "asian" ] } }
我想查询此表以查找包含以下种族之一的用户(例如)-“白人”、“非裔美国人”
我希望我上面的示例用户会被返回,因为他们的比赛字段包含“白色”。
我尝试过这样的事情但没有成功 -
SELECT user_id from table
WHERE profile -> 'data' ->> 'races' = ANY('{"white", "african american"}')
使用 Postgres 13.x
谢谢!
使用?|
操作员:
select user_id
from my_table
where profile -> 'data' -> 'races' ?| array['white', 'african american']
根据文档:
jsonb?| 文本[] -> boolean
文本数组中的任何字符串是否作为顶级键或数组元素存在?
您的查询有两个问题。
->>
返回text
而不是 jsonb。 所以你问的是文本["white", "asian"]
是否匹配white
或african american
。
您可能这样做是因为否则您在尝试将any
与 JSONB 一起使用时会出现类型错误。 any
人都想要一个 Postgres 数组来比较,它必须是一个 jsonb 数组。 我们能做到这一点...
select user_id
from user
where profile -> 'data' -> 'races' = ANY(array['"white"', '"african american"']::jsonb[]);
但这和以前有同样的问题,它正在检查 json 数组[ "white", "asian" ]
是否等于"white"
或"african american"
。
您需要一个与 JSON 的每个元素匹配的运算符。 使用?|
运营商。
select user_id
from users
where profile -> 'data' -> 'races' ?| array['white', 'african american'];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.