При первом запросе возникает ошибка, поскольку в предложении FROM
можно использовать только табличных экспериментов (не выражения значений).
Вы можете сделать второй запрос немного проще:
select *
from r
where exists (
select from jsonb_array_elements(dat->'numbers') subarray
where subarray = '[1,1]'
);
или использовать функцию в боковом соединении:
select r.*
from r
cross join jsonb_array_elements(dat->'numbers')
where value = '[1,1]';
Нет индекса, который мог бы поддерживатьэти запросы из-за использования jsonb_array_elements()
.
У вас может возникнуть соблазн использовать оператор удержания @>
следующим образом:
select *
from r
where dat->'numbers' @> '[[1,1]]'::jsonb
id | dat
----+------------------------------------------------------------
1 | {"name": "a", "numbers": [[1, 2], [3, 4], [5, 6], [1, 3]]}
2 | {"age": 5, "numbers": [[1, 1]]}
(2 rows)
К сожалению, как вы можете видеть, это не работает, как вы могли ожидать.Использование оператора для массивов немного сложнее, так как он работает следующим образом: array1 @> array2
верно, если для каждого элемента j
из array2
существует i
в array1
, такое что i @> j
.Следовательно, согласно документации:
порядок элементов массива не имеет значения при сопоставлении содержимого, и дублирующие элементы массива фактически рассматриваются только один раз.