Мне не удалось найти информацию о том, как выполнять запросы in / subsetof / contains с использованием JsonPath в Postgres.

Например Предполагая, что следующие данные в столбце jsonb с именем data

{
   "name": "foo",
   "somearray" : [1,2,3,4,5]
}

Затем я хочу запросить это, используя что-то вроде

SELECT *
FROM mytable
where jsonb_path_exists(data, '($.somearray ??????? [2,4,6,8] ');

Это действительно работает:

SELECT *
FROM mytable
where jsonb_path_exists(data, '($ ? (@.somearray[*] == 2 || @.somearray[*] == 4 /*etc*/) ');

Но я надеюсь, что есть более короткий синтаксис для правильного тестирования подмножества

1
Roger Johansson 11 Дек 2021 в 16:22
Я не думаю, что для этого есть какая-то поддержка. Вам нужно будет написать свой собственный код. Или нормализуйте свою модель данных до состояния, когда вам больше не нужно использовать JSON.
 – 
a_horse_with_no_name
11 Дек 2021 в 16:35

1 ответ

Лучший ответ

К сожалению, нет операторов массива jsonpath, но вы все равно можете использовать операторы массива:

SELECT *
FROM mytable
where (data->>'somearray') :: integer[] @> [2,4,6,8] ;
1
Edouard 12 Дек 2021 в 02:25
Большое спасибо, мне несколько странно, что язык запросов Json не поддерживает это. но вместо этого я выберу ваше решение. 👍
 – 
Roger Johansson
12 Дек 2021 в 13:20