Как запросить наличие ключа в столбце PostgreSQL 9.5 JSONB?

У меня есть таблица базы данных PostgreSQL 9.5 со столбцом JSONB, который называется attrs. Я хочу проверить наличие определенного ключа в этом столбце нарядов. Я думаю, что могу использовать ? оператор, но я не понимаю синтаксиса.

SELECT * FROM cereal WHERE attrs ? 'lbs';

Это возвращает «Количество заданных параметров ‹ количество маркеров параметров».

SELECT * FROM cereal WHERE attrs ? | ARRAY['lbs'];

Это возвращает «Количество заданных параметров ‹ количество маркеров параметров».

Как запросить наличие ключа в столбце JSONB?


person David Watson    schedule 29.01.2016    source источник
comment
Как вы выполняете запрос?   -  person Jakub Kania    schedule 29.01.2016


Ответы (2)


Вы действительно попали в точку со своим первым запросом.

У оператора ? есть ограничение, заключающееся в том, что он проверяет только ключи верхнего уровня значения jsonb. Поэтому вполне вероятно, что ключ, который вы ищете, спрятан где-то глубже в вашем документе JSON. Вы можете использовать ряд операторов jsonb или функций обработки, чтобы перейти к предполагаемому местоположению ключа, а затем выполнить тест: ->, #>, jsonb_each() или jsonb_array_elements() и другие. Итак, вы используете любой из них и запускаете оператор ? над результатом, что-то вроде:

SELECT *
FROM cereal
WHERE (attrs -> 'weight') ? 'lbs';

... для документа JSON, например:

{"ingredients": {...}, "weight": {"lbs": 4, "kg": 1.8}, ...}

Без знания структуры вашего JSON-документа вы не получите более конкретного ответа.

person Patrick    schedule 29.01.2016

Это не ошибка postgresql. Ваш запрос в порядке. Ошибка заключается в том, что все, что вы используете для запуска этого запроса, сбивает с толку ? для заполнителя параметра, вы должны исправить способ, которым вы пытаетесь выполнить запрос, и вы не предоставили достаточно информации, чтобы дать вам подсказку.

person Jakub Kania    schedule 29.01.2016
comment
Спасибо за чаевые. Я зарегистрирую ошибку в psequel, которую я использовал для запуска запроса. - person David Watson; 29.01.2016