postgresql 如何过滤json的嵌套key的值

nxagd54h  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(180)

我在PostgreSQL中有一个表

CREATE TABLE IF NOT EXISTS account_details
(
    account_id integer,
    condition json
);

此表中的数据包括
| 帐户标识|条件|
| - ------|- ------|
| 1个|[{"操作":"阅读","主题":"根公司","条件":{"根公司ID":{" $in ":[35,20,5,6 ]}}]|
| 第二章|[{"操作":"阅读","主题":"根公司","条件":{"根公司ID":{" $in ":[1,4,2,3,6 ]}}]|
| 三个|[{"操作":"阅读","主题":"根公司","条件":{"根公司ID":{" $in ":[5 ]}}}]|
我需要获取(5)中具有rootcompanyid的所有帐户的详细信息。如果任何帐户详细信息中存在任何rootcompanyid的的一部分,则应显示结果。因此输出应包含account_id--〉1和3
下面的查询只提取最后一行(account_id = 3),而不是第一行

SELECT *
  FROM account_details
 WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' = '[5]';
    • 预期产出**:如果任何帐户详细信息中存在任何rootcompanyid的的一部分,则应显示结果。

| 帐户标识|条件|
| - ------|- ------|
| 1个|[{"操作":"阅读","主题":"根公司","条件":{"根公司ID":{" $in ":[35,20,5,6 ]}}]|
| 三个|[{"操作":"阅读","主题":"根公司","条件":{"根公司ID":{" $in ":[5 ]}}}]|

jgwigjjp

jgwigjjp1#

使用JSON包含操作符很容易做到这一点:

WHERE condition::jsonb @> '[ { "conditions": { "rootcompanyid": { "$in": [5] } } } ]'

如果要搜索多个数组元素,请对OR使用上述条件中的两个,或者使用JSONPATH查询:

WHERE jsonb_path_exists(
         condition::jsonb,
         '$[*].conditions.rootcompanyid.\$in[*] ? (@ == 5 || @ == 6)'
      )

相关问题