Postgres jsonb_array_elements

#postgresql #jsonb

Вопрос:

У меня есть таблица со следующим полем jsonb —

 { "auth": [{"roles": ["role1", "role2"]}]}
 

Когда я выполняю этот запрос —

 select jsonb_array_elements(role) as role from (
    select x -> 'roles' as role
    from test,
         jsonb_array_elements(data->'auth') x
 

формат вывода:

 role
----
"role1"
"role2"
 

Текущая проблема заключается в том, что если я попытаюсь добавить, где это не работает

x.role = '"role1"' , но этот действительно работает x.role like '%"role1"%'

Спасибо

Ответ №1:

Поле «роль» можно восстановить в виде текстовых данных с помощью оператора ->>>.

 create table test (data jsonb);

insert into test values('{ "auth": [{"roles": ["role1", "role2"]}]}');

with cte as (
   select jsonb_array_elements(role) ->> 0 as role from 
     (
       select x -> 'roles' as role
              from test, jsonb_array_elements(data->'auth') x) y)
select role from cte where role = 'role1';
 

Ответ №2:

Проблема в том , что jsonb_array_elements возвращает результаты как jsonb , и у вас возникают проблемы при сравнении этого со строковым литералом.

Используйте jsonb_array_elements_text вместо первого jsonb_array_elements вызова, тогда результаты будут иметь тип text , который не должен доставлять вам никаких проблем.