假设我有 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
值与 json_each()
分解为键:值对并进行比较。这将在 exists
条件下工作:演示
SELECT *
FROM my_table
WHERE exists (select from json_each(json_col->'a')_(key,value)
where (value->>'success') <> 'true');