我在PostgreSQL中有一张表

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

这张表中的数据是

account_id condition
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的详细信息.如果任何帐户详细信息中存在任何**rootpananyid**的一部分,则应显示结果. 因此,输出应包含account_id --> 1 and 3

下面的查询只读取最后一行(count_id=3),而不是第一行

SELECT *
  FROM account_details
 WHERE ((condition->0->>'conditions')::json->>'rootcompanyid')::json->>'$in' = '[5]';

Expected Output:如果任何帐户详细信息中存在任何**rootpananyid**的一部分,则应显示结果.

account_id condition
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)'
      )

Sql相关问答推荐

查询将查找将标记设置为user2的用户

SQL查询以条件空值跟踪生产操作结果进展

从自定义日期和时间开始,每月具有给定状态的公司数量

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

SQL:计算与另一列中给定值互斥的匹配项

返回UPSERT中的旧行值

关于Postgres横向联接的谓词

在xml.Modify方法中使用子字符串和可能的替代方法

仅在日期相隔时递增(Oracle SQL)

SQL仅返回第一个字母在A-Z之间的值

如何判断小数点后千位是否不为0

Postgresql 生成器列导致语法错误

有没有办法在雅典娜中将字符串转换为 int ?

Snowflake中的动态SQL优化

基于 Snowflake 的最大值创建新列

在 MS Access VBA 中,如何测量显示查询的时间?

将有效数字作为 varchar 返回的 SQL 函数

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

我现在如何显示重复的汽车? postgresql

SQL Server Where 条件