id IN :ids)
Смысл такой, проверить, содерижтся ли в ячейке oc.regions (тип jsonb, внутри массив text[]) хотя бы один регион из подзапроса.
Чем можно заменить оператор ?| ?
Хмм... а зачем его чем-то заменять?
ORM по своему интерпритирует знак ? :)
Ну и ну. ;( А escaping / quoting там нет? А так — можно завернуть его в функцию, например. Или заменить на jsonpath, как тут недавно показывал Nikita Glukhov (https://t.me/pgsql/479095). Примерно так: oc.regions ?| ARRAY(...) → jsonb_path_exists(oc.regions, '$[*] ? (@ == $ids[*])', jsonb_build_object('ids', ARRAY(...))
Спасибо! Я немного поковырял и пришел к вот такому решению: oc.regions <@ (SELECT jsonb_agg(DISTINCT region) FROM table WHERE id IN (:ids))
Но это же не то же самое — тут включение, а у Вас было пересечение, вроде... нет?
да, но мне кажется мой фильтр работает корректно т.е. если в хоть один из элементов левой части содержится в правой, то фильтр срабатывает возможно я невижу ошибку и вы можете подсказать кейс в котором это не сработает?
Например: SELECT '["a", "b"]' <@ '["a", "c", "d"]'::jsonb, '["a", "b"]'::jsonb ?| ARRAY['a', 'c', 'd']; Вы же вроде подобный код показывали?
Обсуждают сегодня