postgresql - PGSQL JSONB 中带有部分路径的深度 JSON 查询?

标签 postgresql jsonb

给定一些像这样的 JSON 文档:

  {
    id: some_id,
    l1: {
      f1: [
        {
          c1: foo,
          c2: bar
        },
        {
          c1: foo1,
          c2: bar1
        },
      ],
      f2: [
        {
          c3: baz,
          c4: bar
        },
      ],    
    }
  }

我如何查询 PostgreSQL JSONB 的 f1....c1: foo1——即没有给出 lX,也没有给出 c1-c2 子文档的列表位置。

这不是 Deep JSON query with partial path in MySQL 5.7? 的副本因为那是关于 MySQL 而这一个是关于 PgSQL JSONB。

最佳答案

在这里您需要遍历路径 {l1,f1} #> 的元素列表- 运算符在指定路径获取 JSON 对象;之后,检查是否有任何子文档包含 '{"c1":"foo1"}'::jsonb 元素 - @> (运算符检查左边的 JSON 值是否包含正确的值):

WITH t(val) AS ( VALUES
  ('{
      "id": "some_id",
      "l1": {
        "f1": [
          {
            "c1": "foo",
            "c2": "bar"
          },
          {
            "c1": "foo1",
            "c2": "bar1"
          }
        ],
        "f2": [
          {
            "c3": "baz",
            "c4": "bar"
          }
        ]
      }
  }'::JSONB)
)
SELECT f1_array_element AS output
FROM
  t,jsonb_array_elements(t.val#>'{l1,f1}') AS f1_array_element
WHERE f1_array_element @> '{"c1":"foo1"}'::JSONB;

结果:

            output            
------------------------------
 {"c1": "foo1", "c2": "bar1"}
(1 row)

更新

如果我们不知道确切的 lX 位置,我们需要遍历每个子文档,而不是遍历每个 fX;查询如下:

SELECT count(*)
FROM
  t,
  jsonb_each(t.val#>'{l1}') AS fX_sub_doc,
  jsonb_array_elements(fX_sub_doc.value) AS cX_sub_doc
WHERE
  cX_sub_doc @> '{"c1":"foo1"}';

关于postgresql - PGSQL JSONB 中带有部分路径的深度 JSON 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35444927/

相关文章:

mysql - 如何优化 'IN' 查询?

sql - PostgreSQL JSONB 按单词查找文档

sql - 将 JSON 扩展为以第一行为模板的列

sql - 在 postgres 中更新 jsonb 对象

sql - 选择提供的列表中 jsonb 字段所在的行

sql - 如果搜索未找到值,则在 sql 中添加硬编码行

postgresql - 来自 jsonb 的 SQLAlchemy Pandas read_sql

postgresql - 从 Postgres 的 JSONB 字段中选择不为空的值

java - 如何在 .NET、Java 和 Sql Server 上获得正确的字符数? (在谷歌浏览器中阅读)

java - Hibernate/JPA/GlassFish/Netbeans 在哪里存储数据?