我的PgSql表中有jsonb列,其中包含以下数据:
{
"group": [
{
"child1": "test",
"child2": "test"
},
{
"child1": "test2",
"child2": "lorem ipsum"
}
]
}
“组”可以是多个,并且是嵌套子数据的复合。
是否可以在一个选择请求中合并“ child1”数据,或者检查嵌套的“ child1”之一是否类似于%test%。
谢谢。
答案 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
,请删除使用双引号引起来的字符串。
答案 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"'