[英]How to filter a value of nested key of json in postgres
我在 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]}}}] |
3个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[5]}}}] |
4个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[1,2,3,5]}}}] |
5个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[3,4]}}}] |
6个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[4]}}}] |
7 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[3]}}}] |
我需要获取rootcompanyid中存在的部分值
请指导我如何过滤嵌套的 JSON 数据
预计 Output
情况1
每当我将输入 rootcompanyid = 5 传递给下面的查询时,它应该过滤掉 account_id 1,3 和 4 的详细信息
SELECT *
FROM account_details
WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' = 5;
帐户ID | 状况 |
---|---|
1个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[35,20, 5 ,6]}}}] |
3个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[ 5 ]}}}] |
4个 | [{“action”:“read”,“subject”:“rootcompany”,“conditions”:{“rootcompanyid”:{“$in”:[ 1,2,3,5 ]}}}] |
案例:2
每当我将输入 rootcompanyid = 3,4 传递给下面的查询时,它应该过滤掉 account_id 2,4,5,6 和 7 的详细信息
SELECT *
FROM account_details
WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' = 3,4;
帐户ID | 状况 |
---|---|
2个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[1, 4 ,2, 3 ]}}}] |
4个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[1,2, 3 ,5]}}}] |
5个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[ 3 , 4 ]}}}] |
6个 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[ 4 ]}}}] |
7 | [{"action":"read","subject":"rootcompany","conditions":{"rootcompanyid":{"$in":[ 3 ]}}}] |
请给我最好的解决方案来过滤部分和匹配的JSON格式的 rootcompanyid
您需要比较嵌套的json
中的元素。 这是一个例子:
SELECT *
FROM account_details
WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' = '[35,20,5,6]';
condition->0
- 数组的第一个元素
->>'conditions')::json
- 从数组的第一个元素中提取conditions
->>'rootcompanyid')::json
- 从conditions
中提取rootcompanyid
::json->>'$in'
- 从rootcompanyid
( rootcompanyid
的 id)中提取$in
按动作搜索:
SELECT *
FROM account_details
WHERE condition->0->>'action' = 'read';
更新
要在json array
中搜索特定id
,您可以使用@>
运算符:
SELECT *
FROM account_details
WHERE ((((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in')::jsonb) @> '[3,1]'::jsonb
或者LIKE
:
SELECT *
FROM account_details
WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' LIKE '%5%';
更新 v2
您可以使用json_array_elements_text
+ exists
:
WITH parsed_conditions AS (
SELECT account_id,
json_array_elements_text(
(((condition -> 0 ->> 'conditions')::json ->> 'rootcompanyid')::json ->>'$in')::json
) AS json_id
FROM account_details
)
SELECT *
FROM account_details AS a
WHERE exists(
SELECT DISTINCT account_id
FROM parsed_conditions
WHERE json_id IN ('3', '1')
AND parsed_condidtions.account_id = a.account_id
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.