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 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
,则去掉包裹它的双引号。
我会使用存在条件:
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"'
我的 PgSql table 中有 jsonb 列,其中包含如下数据:
{
"group": [
{
"child1": "test",
"child2": "test"
},
{
"child1": "test2",
"child2": "lorem ipsum"
}
]
}
“组”可以是多个并且是复合嵌套子数据。
是否可以在一个 select 请求中连接“child1”数据或检查嵌套的“child1”之一是否类似于 %test%。
提前致谢。
您可以使用这样的 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
,则去掉包裹它的双引号。
我会使用存在条件:
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"'