Concat /搜索多个jsonb嵌套值

时间:2020-11-02 08:10:02

标签: json postgresql jsonb

我的PgSql表中有jsonb列,其中包含以下数据:

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

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

是否可以在一个选择请求中合并“ child1”数据,或者检查嵌套的“ child1”之一是否类似于%test%。

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我会使用一个存在条件:

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"'