PostgreSQL: исключить полный массив jsonb, если один элемент не соответствует предложению WHERE - PullRequest
1 голос
/ 24 февраля 2020

Предположим таблицу json_table со столбцами id (int), data (jsonb). Примером значения jsonb будет

{"a": [{"b":{"c": "xxx", "d": 1}},{"b":{"c": "xxx", "d": 2}}]}

Когда я использую оператор SQL, подобный следующему:

SELECT data FROM json_table j, jsonb_array_elements(j.data#>'{a}') dt WHERE (dt#>>'{b,d}')::integer NOT IN (2,4,6,9) GROUP BY id;

... два элемента массива неопубликованы, и тот, который квалифицируется предложение WHERE все еще возвращается. Это имеет смысл, поскольку каждый элемент массива рассматривается индивидуально. В этом примере я вернусь к полной строке

{"a": [{"b":{"c": "xxx", "d": 1}},{"b":{"c": "xxx", "d": 2}}]}

Я ищу способ исключить полную строку json_table, когда любой элемент массива jsonb не выполняет условие

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Вы можете достичь этого с помощью следующего запроса:

select data 
from json_table
where jsonb_path_match(data, '!exists($.a[*].b.d ? ( @ == 2 || @ == 4 || @ == 6 || @ == 9))') 
0 голосов
/ 24 февраля 2020

Вы можете переместить условие в предложение WHERE и использовать NOT EXISTS:

SELECT data
FROM json_table j
WHERE NOT EXISTS (SELECT 1
                  FROM jsonb_array_elements(j.data#>'{a}') dt 
                  WHERE (dt#>>'{b,d}')::integer IN (2, 4, 6, 9)
                 );
...