在 jsonb postgres 中使用通配符搜索
Use wildcard searches in jsonb postgres
我需要通过 postgres 对嵌套在 jsonb 结构中更深层次的字段执行通配符搜索。我知道如何查询完全匹配,但我也需要进行部分匹配。下面是 json 架构。
Table姓名-员工
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}]
的所有值。
结构中的那些嵌套数组确实使搜索变得困难。因此,您需要两次取消嵌套结构,以便您可以访问各个值。
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()
调用returns顶级数组的所有数组元素作为行。对于每一行,键 'b'
处的所有 key/value 对再次提取为行。然后可以使用 LIKE
条件搜索该结果。
在线示例:https://rextester.com/FCUJU88109
您可以通过 运行 查看子 select 的作用:
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);
我需要通过 postgres 对嵌套在 jsonb 结构中更深层次的字段执行通配符搜索。我知道如何查询完全匹配,但我也需要进行部分匹配。下面是 json 架构。
Table姓名-员工
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}]
的所有值。
结构中的那些嵌套数组确实使搜索变得困难。因此,您需要两次取消嵌套结构,以便您可以访问各个值。
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()
调用returns顶级数组的所有数组元素作为行。对于每一行,键 'b'
处的所有 key/value 对再次提取为行。然后可以使用 LIKE
条件搜索该结果。
在线示例:https://rextester.com/FCUJU88109
您可以通过 运行 查看子 select 的作用:
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);