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

bxgwgixi  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(193)

假设我有一个json列,它看起来像这样:

  1. -- first row:
  2. {
  3. "a": {
  4. "x": {"name": "ben", "success": true},
  5. "y": {"name": "sarah", "success": true},
  6. "z": {"name": "john", "success": false}
  7. }
  8. }
  9. -- second row:
  10. {
  11. "a": {
  12. "m": {"name": "issac", "success": true},
  13. "n": {"name": "jack", "success": true},
  14. }
  15. }

字符串
我想选择所有行,其中任何a.<something>.success是不真实的。
在我的例子-第一行将被选中,第二行将被过滤。
正如你所看到的,所有的json都以公共键a开始,但是在它下面有未知数量的“查尔兹”和未知的名字(“x”,“y”,“z”,“m”,“n”)。在每个未知名字的孩子下面-有一个公共的已知键,我想过滤:success
问题是如何过滤这些行?
我做了一些我无法完成的事情:

  1. SELECT * FROM my_table WHERE json_col::json -> 'a' -> <don't know what to put here> -> 'success' = true

d8tt03nd

d8tt03nd1#

您可以使用json_each()json值分解为键:值对并检查值。

  1. SELECT *
  2. FROM my_table
  3. WHERE exists (select from json_each(json_col->'a')_(key,value)
  4. where (value->>'success') <> 'true');

字符串
| 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开始支持):

  1. ALTER TABLE my_table ALTER COLUMN json_col TYPE jsonb;
  2. CREATE INDEX ON my_table USING GIN(json_col jsonb_path_ops);
  3. SELECT *
  4. FROM my_table
  5. WHERE json_col @@ '$.a.*.success<>true';


如果你用的是11版,它是support ended on 2023-11-09。考虑升级。

展开查看全部

相关问题