Как перебрать массив JSON объектов JSON, чтобы увидеть, содержит ли он значение, которое я ищу в postgres?

Вот пример объекта json

rawJSON = [
   {"a":0, "b":7},
   {"a":1, "b":8}, 
   {"a":2, "b":9}
]

И у меня есть таблица, которая по сути выглядит так.

demo Table

id | ...(other columns)      | rawJSON
------------------------------------
0  | ...(other columns info) | [{"a":0, "b":7},{"a":1, "b":8}, {"a":2, "b":9}]
1  | ...(other columns info) | [{"a":0, "b":17},{"a":11, "b":5}, {"a":12, "b":5}]

Я хочу вернуть строку, которая внутриRawJSON имеет значение от "a" менее 2 И значение от "b" менее 8. ОНИ ДОЛЖНЫ БЫТЬ ИЗ ОДНОГО ОБЪЕКТА JSON.

По сути, запрос будет выглядеть примерно так

SELECT *
FROM demo
WHERE FOR ANY JSON OBJECT in rawJSON column -> "a" < 2 AND -> "b" < 8

И потому вернется

id | ...(other columns)      | rawJSON
------------------------------------
0  | ...(other columns info) | [{"a":0, "b":7},{"a":1, "b":8}, {"a":2, "b":9}]

Я искал из нескольких сообщений здесь, но не смог понять это. https://dba.stackexchange.com/questions/229069/extract-json-array-of-numbers-from-json-array-of-objects https://dba.stackexchange.com/questions/54283/how-to-превратитьjson-массиввмассивpostgres

Я думал о создании функции plgpsql, но не смог понять.

Любой совет, я был бы очень признателен!

Спасибо!!

Я хотел бы избежать бокового перекрестного соединения, потому что это сильно замедлит работу.


person user2109770    schedule 08.12.2019    source источник
comment
Пожалуйста, не делайте не кросспостинг, который уже задан и на который вы ответили здесь: dba.stackexchange.com/questions/255128   -  person a_horse_with_no_name    schedule 09.12.2019


Ответы (1)


Вы можете использовать подзапрос, который просматривает элементы массива вместе с EXISTS.

SELECT *
       FROM demo d
       WHERE EXISTS (SELECT *
                            FROM jsonb_array_elements(d.rawjson) a(e)
                            WHERE (a.e->>'a')::integer < 2
                                  AND (a.e->>'b')::integer < 8);

db‹>скрипка

Если тип данных для rawjsonjson, а не jsonb, используйте json_array_elements() вместо jsonb_array_elements().

person sticky bit    schedule 08.12.2019