Concat / 搜索多个 jsonb 嵌套值

Concat / Search on multiple jsonb nested values

我的 PgSql table 中有 jsonb 列,其中包含如下数据:

{
  "group": [
    {
      "child1": "test",
      "child2": "test"
    },
    {
      "child1": "test2",
      "child2": "lorem ipsum"
    }
  ]
}

“组”可以是多个并且是复合嵌套子数据。

是否可以在一个 select 请求中连接“child1”数据或检查嵌套的“child1”之一是否类似于 %test%。

提前致谢。

您可以使用这样的 SELECT 语句,包括两个带有 CROSS JOINs 的函数:

SELECT j2.*
  FROM t
 CROSS JOIN JSONB_EACH(data) AS j
 CROSS JOIN JSONB_ARRAY_ELEMENTS(data->'group') AS j2
 WHERE j2::TEXT like '%"test"%'

为了严格查找具有精确值 "test" 且没有任何标题或尾随部分的字符串。如果您需要该值是否包含子字符串 test,则去掉包裹它的双引号。

Demo

我会使用存在条件:

select t.*
from the_table t
where exists (select *
              from jsonb_array_elements(t.data -> 'group') as g(element)
                cross join jsonb_each_text(g.element) as x(key,value)
              where x.key = 'child1'
                and x.value like '%test%')

从 Postgres 12 开始,您可以使用 SQL/JSON 路径表达式:

select *
from the_table t
where data @@ '$.group[*].child1 like_regex "test"'