我有一個具有以下結構的表 -
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
謝謝!
uj5u.com熱心網友回復:
使用?|運算子:
select user_id
from my_table
where profile -> 'data' -> 'races' ?| array['white', 'african american']
根據檔案:
jsonb ?| 文本 [] -> 布林值
文本陣列中的任何字串是否作為頂級鍵或陣列元素存在?
uj5u.com熱心網友回復:
tl;博士使用?|運算子。
您的查詢有兩個問題。
->>回傳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"or "african american"。
您需要一個與 JSON 的每個元素匹配的運算子。使用?|運算子。
select user_id
from users
where profile -> 'data' -> 'races' ?| array['white', 'african american'];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410417.html
標籤:
