#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
, который не должен доставлять вам никаких проблем.