Запрос с использованием поля JSONB

У меня есть поле в базе данных PostgreSQL с типом JSONB в формате ["tag1","tag2"], и я пытаюсь реализовать поиск, который предоставит результаты для раскрывающегося списка с прогнозированием (т.е. если пользователь вводит «t» и столбец выше существует, оба тега вернулся.

Любые предложения о том, как это сделать?

Я попробовал запрос ниже, но он не работает:

SELECT table.tags::JSONB from table where table.tags::TEXT like 't%';

person thurmc    schedule 17.08.2016    source источник
comment
Что в нем не работает? Каков ваш ожидаемый результат?   -  person Nick    schedule 17.08.2016
comment
Он не возвращает никаких результатов, хотя есть теги, которые должны соответствовать запросу. Я заметил, что запрос далеко. Я пытаюсь изменить его на основе ответа здесь stackoverflow.com/questions/34596716/, но поскольку структура jsonb сильно отличается в связанный вопрос, я не могу понять, как адаптировать его к моей структуре   -  person thurmc    schedule 17.08.2016


Ответы (1)


Один из способов сделать это — использовать функцию jsonb_array_elements_text() (https://www.postgresql.org/docs/current/static/functions-json.html)

Пример теста:

SELECT  *
FROM    jsonb_array_elements_text($$["tag1","tag2","xtag1","ytag1"]$$::jsonb)
WHERE   value LIKE 't%';
 value
-------
 tag1
 tag2
(2 rows)

Поскольку jsonb_array_elements_text() создает набор записей, и в вашем случае нет другого условия, кроме LIKE, то использование LATERAL (https://www.postgresql.org/docs/9.5/static/queries-table-expressions.html#QUERIES-LATERAL) должен помочь вам, как это :

SELECT  T.tags
FROM    table T,
LATERAL jsonb_array_elements_text(T.tags) A
WHERE   A.value LIKE 't%';
person Kristo Mägi    schedule 17.08.2016
comment
В качестве альтернативы вы можете использовать запрос WITH (также известный как CTE). Подробнее: https://www.postgresql.org/docs/current/static/queries-with.html - person Kristo Mägi; 17.08.2016
comment
Спасибо, это сработало идеально! Трудно было найти ответы, где столбец JSONB не был в структуре более сложного объекта, а не просто массива - person thurmc; 17.08.2016