在jsonb postgres中使用通配符搜索

时间:2019-01-31 10:59:22

标签: postgresql-9.5

我需要通过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}]在所有阵列的所有的值不搜索。

1 个答案:

答案 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);