在 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);