[英]How to filter a value of nested key of json
我在 PostgreSQL 有一張桌子
CREATE TABLE IF NOT EXISTS account_details
(
account_id integer,
condition json
);
這張表中的數據是
帳戶ID | 狀況 |
---|---|
1個 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[35,20,5,6]}}}] |
2個 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[1,4,2,3,6]}}}] |
3個 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[5]}}}] |
我需要在 (5) 中獲取所有具有rootcompanyid的帳戶的詳細信息。 如果任何 **rootcompanyid 的 ** 部分存在於任何帳戶詳細信息中,則應顯示結果。 所以 output 應該包含account_id --> 1 和 3行
下面的查詢只獲取最后一行 (account_id = 3) 而不是第一行
SELECT *
FROM account_details
WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' = '[5]';
預期 Output :如果任何 **rootcompanyid 的 ** 部分存在於任何帳戶詳細信息中,則應顯示結果。
帳戶ID | 狀況 |
---|---|
1個 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[35,20,5,6]}}}] |
3個 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[5]}}}] |
使用 JSON 包含運算符可以輕松完成此操作:
WHERE condition::jsonb @> '[ { "conditions": { "rootcompanyid": { "$in": [5] } } } ]'
如果要搜索多個數組元素,請將上述條件中的兩個與OR
一起使用或使用 JSONPATH 查詢:
WHERE jsonb_path_exists(
condition::jsonb,
'$[*].conditions.rootcompanyid.\$in[*] ? (@ == 5 || @ == 6)'
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.