Используйте поиск по шаблону в jsonb postgres - PullRequest
0 голосов
/ 31 января 2019

Мне нужно выполнить поиск по шаблону для полей, вложенных на более глубоком уровне в структуру jsonb через postgres.Я знаю, как запрашивать точные совпадения, но мне нужно также делать частичные совпадения.Ниже приведена схема 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 голосов
/ 01 февраля 2019

Эти вложенные массивы внутри структуры действительно затрудняют поиск.В результате вам нужно дважды развернуть структуру, чтобы получить доступ к отдельным значениям.

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