Использование функций, возвращающих множество, в предложениях WHERE

SELECT * from users where server_id=$1 and $2=ANY(json_object_keys(contacts));

ERROR:  set-returning functions are not allowed in WHERE

contacts — это столбец json, и мне нужно найти строки, в ключах которых contacts есть $2.

Пример столбца контактов: {"90144": 0, "89915": 0}

Если $2 равно 90144, запрос должен возвращать каждую строку, содержащую 90144 в ключах contacts', как в примере. Как я мог этого добиться? Заранее спасибо.


person Midorina    schedule 23.02.2020    source источник
comment
SELECT true WHERE '90144' IN ( SELECT json_object_keys('{"90144": 0, "89915": 0}'::json)) -- верно   -  person clamp    schedule 23.02.2020


Ответы (1)


Использовать ? оператор.

SELECT * from users where server_id=$1 and contacts::jsonb ? $2;
person jjanes    schedule 23.02.2020
comment
Это сработало. Спасибо. Но мне любопытно, почему приведение к jsonb является обязательным. Не? работать с json? - person Midorina; 23.02.2020
comment
Нет, это работает только для JSONB. Возможно, вам следует изменить тип столбца на JSONB, так как это намного быстрее для этого типа операций — он хранится в уже проанализированной форме. - person jjanes; 23.02.2020