在postgres中的json对象中搜索多个随机命名的子键

问题描述 投票:0回答:1

假设我有 json 列,看起来像:

-- first row:
{
        "a": {
            "x": {"name": "ben", "success": true},
            "y": {"name": "sarah", "success": true},
            "z": {"name": "john", "success": false}
        }
    }

-- second row:
{
        "a": {
            "m": {"name": "issac", "success": true},
            "n": {"name": "jack", "success": true},
        }
    }

我想选择其中任何一个

a.<something>.success
不正确的所有行。

在我的示例中 - 第一行将被选择,第二行将被过滤。

正如你所看到的,所有的 json 都以公共键

a
开头,但在它下面有未知数量的“孩子”,其名称未知('x','y','z','m','n') 。 在每个名字未知的孩子下 - 有一个我想过滤的常见已知键:
success

问题是如何过滤这些行?

我遇到了一些无法完成的事情:

SELECT * FROM my_table WHERE json_col::json -> 'a' -> <don't know what to put here> -> 'success' = true
json postgresql postgresql-11
1个回答
0
投票

您可以将

json
值与
json_each()
分解为键:值对并进行比较。这将在
exists
条件下工作:演示

SELECT * 
FROM my_table
WHERE exists (select from json_each(json_col->'a')_(key,value)
              where (value->>'success') <> 'true');
© www.soinside.com 2019 - 2024. All rights reserved.