Извлечь элементы из массива внутри поля jsonb в Postgresql - PullRequest
0 голосов
/ 14 апреля 2020

В моей таблице Postgresql есть поле jsonb с именем data, которое содержит данные в следующем формате:

{
 list:[1,2,3,4,5]
}

Я использую запрос:

select data->'list' from "Table" where id=1

Это дает мне массив [1,2,3,4,5]

Проблема в том, что я хочу использовать этот результат в другом запросе выбора в предложении IN. Он не принимает массив.

IN ([1,2,3,4,5]) терпит неудачу

Он хочет:

IN (1,2,3,4,5)

Итак, в моем исходном запросе я не знаю, как скрыть [1 , 2,3,4,5] до 1,2,3,4,5

Мой текущий запрос:

select * from "Table2" where "items" in (select data->'list' from "Table" where id=1)

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вы можете использовать оператор массива (@>) вместо IN, если вы приведете значение поиска к jsonb. Например:

SELECT *
FROM "Table2"
WHERE items::jsonb <@ (SELECT data->'list' FROM "Table" WHERE id=1)

Обратите внимание, что если items является int, вам нужно будет разыграть его char перед приведением к jsonb:

SELECT *
FROM "Table2"
WHERE cast(items as char)::jsonb <@ (SELECT data->'list' FROM "Table" WHERE id=1)

Демо на dbfiddle

0 голосов
/ 14 апреля 2020

Используйте jsonb_array_elements(), чтобы превратить элементы в строки

select t2.*
from table_2 t2
where t2.items in (select jsonb_array_elements_text(t1.data -> 'list')::int
                   from table_1 t1 
                   where t1.id = 1);

Предполагается, что items определен как text или varchar и содержит одно значение - однако имя (множественное число! ), кажется, указывает на еще один ненормализованный столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...