Как вывести список текстовых элементов из поля jsonb для выполнения предложения IN по полю типа uuid?

Имеется foo таблица со следующими полями:

  • uuid типа uuid
  • информация типа jsonb

Среди прочего поле info содержит ключ bar со списком uuid из той же таблицы (foo). Теперь мне нужно выбрать все foo записей, где uuid в списке информации-> «панель» для какой-то конкретной записи. Я попытался выбрать запрос ниже и получил ошибку operator does not exist: uuid = uuid[]

SELECT uuid 
FROM foo 
WHERE uuid IN (SELECT jsonb_array_to_text_array(info->'bar')::uuid[] 
               FROM foo 
               WHERE uuid='some_uuid');

Как мне нужно изменить запрос, чтобы сделать это? у меня нет идей


person Roman Kozinets    schedule 06.08.2019    source источник


Ответы (1)


Там нет такой функции с именем jsonb_array_to_text_array

Но вы можете использовать функцию jsonb_array_elements_text(), которая расширяет каждый элемент массива в одну строку. С этим результатом вы можете фильтровать их, чтобы найти uuids.

demo:db‹>скрипка

SELECT
    elements::int AS uuid
FROM
    foo,
    jsonb_array_elements_text(info -> 'bar') elements
WHERE uuid = 4  

Если вам нужна вся запись:

demo:db‹>скрипка

SELECT 
    *
FROM foo
WHERE uuid IN (
    SELECT
        elements::int
    FROM
        foo,
        jsonb_array_elements_text(info -> 'bar') elements
    WHERE uuid = 4  
)
person S-Man    schedule 06.08.2019
comment
ааа, извините, я забыл упомянуть, что jsonb_array_elements_text — это моя пользовательская функция, основанная на функции jsonb_array_elements_text. Только что проверил ваше решение, и да, оно сработало. Спасибо - person Roman Kozinets; 07.08.2019