我需要通过postgres对jsonb结构中更深层嵌套的字段执行通配符搜索。我知道如何查询确切的比赛,但我需要做的部分匹配也是如此。下面是json模式。
表名-员工
json_data={
"data":[
{“a”:"Amit",”b”: [ { “val”: "India"} ] },
{“a”:"Akash",”b”: [ { “val”: "Indonesia"} ] }
]}
select json_data
from employee
where json_data @> '"data":[{"b":[{"val":"India"}]}]';
我需要为b:[{val:%Ind}]
在所有阵列的所有的值不搜索。
答案 0 :(得分:0)
结构中的嵌套数组确实使搜索变得困难。因此,您需要取消嵌套结构两次,以便可以访问各个值。
select e.*
from employee e
where exists (select *
from jsonb_array_elements(e.json_data #> '{data}') as x1(data)
cross join lateral jsonb_array_elements(x1.data -> 'b') as x2(b)
where x2.b ->> 'val' like 'Ind%');
jsonb_array_elements()
调用将顶级数组的所有数组元素作为行返回。对于每一行,键'b'
上的所有键/值对再次提取为行。然后可以使用LIKE
条件搜索该结果。
在线示例:https://rextester.com/FCUJU88109
您可以通过运行以下内容查看子选择的作用:
select e.id, x1.data, x2.b
from employee e
cross join lateral jsonb_array_elements(e.json_data #> '{data}') as x1(data)
cross join lateral jsonb_array_elements(x1.data -> 'b') as x2(b);