【问题标题】:Concat / Search on multiple jsonb nested valuesConcat / 搜索多个 jsonb 嵌套值
【发布时间】:2020-12-01 16:34:38
【问题描述】:

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

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

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

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

提前致谢。

【问题讨论】:

  • 你想要的输出到底是什么?与条件匹配的所有行的整个 JSON 值?还是只匹配条件的部分 JSON?

标签: json postgresql jsonb


【解决方案1】:

您可以使用这样的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

【讨论】:

  • 谢谢,我做了一个测试,它可以工作。我必须更深入地研究 CROSS JOIN 的功能,这不是微不足道的。以及我们使用 j2.value 的原因。
  • 不客气@Benito103e。不错,是的,value 是多余的。
  • 使用这个解决方案,如果一行有 2 个符合条件的孩子1,我还需要添加一个 groupBy。
【解决方案2】:

我会使用存在条件:

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

【讨论】:

  • 哇,这个 Pg12 功能太棒了!使用路径表达式会很有帮助。
  • 同时使用“cross join”和“exist”似乎完全可以满足我的需要。现在得看看怎么翻译成ORM语言=)
猜你喜欢
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2017-04-12
  • 2013-05-04
  • 2013-05-09
  • 2022-08-13
  • 2019-04-24
相关资源
最近更新 更多