Как проверить, существует ли значение в списке JSONB - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь выяснить в JSONB-запросе PostgreSQL 11

SELECT id, my_json_field #>> '{field_depth_1, field_depth_2}' 
FROM my_data 
WHERE my_json_field @> '{"other_field": 3}'::jsonb

Если other_field - это пара ключ-значение, это прекрасно работает, и я получаю каждую строку с other_field = 3. Однако, если other_field является списком значений, например: [2,3,6,8,10], и я хочу выяснить для каждой строки, существует ли значение 3 в списке, представленном other_field, какмне написать запрос?

1 Ответ

1 голос
/ 07 октября 2019

Используйте оператор @>. Согласно документации:

@> jsonb Содержит ли левое значение JSON правильные записи пути / значения JSON на верхнем уровне?

Пример:

with my_data(id, my_json_field) as (
values
    (1, '{"field_depth_1": {"field_depth_2": "something 1"}, "other_field": 3}'::jsonb),
    (2, '{"field_depth_1": {"field_depth_2": "something 2"}, "other_field": 4}'),
    (3, '{"field_depth_1": {"field_depth_2": "something 3"}, "other_field": [2,3,6,8,10]}'),
    (4, '{"field_depth_1": {"field_depth_2": "something 4"}, "other_field": [2,4,6,8,10]}')
)

select id, my_json_field #>> '{field_depth_1, field_depth_2}' as value
from my_data 
where my_json_field->'other_field' @> '3'

 id |    value    
----+-------------
  1 | something 1
  3 | something 3
(2 rows)    
...