假设我有一个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
型
1条答案
按热度按时间d8tt03nd1#
您可以使用
json_each()
将json
值分解为键:值对并检查值。字符串
| ID| json_col|
| --|--|
| 1 |{1} “a”:{ “x”:{“name”:“ben”,“success”:true}, “y”:{“name”:“sarah”,“success”:true}, “z”:{“name”:“john”,“success”:false} } 个文件夹|
如果您从
json
切换到jsonb
,您将能够通过GIN索引加快搜索速度,摆脱无关紧要的空白,删除重复数据并对键进行排序,获得更多函数和运算符可供选择,如@@
(以及其他jsonpath
相关功能从版本12开始支持):型
如果你用的是11版,它是support ended on 2023-11-09。考虑升级。