繁体   English   中英

如何在postgres中过滤json的嵌套键值

[英]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' - 从rootcompanyidrootcompanyid的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM