t=# with c(id,data) as (values(1,'[{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]'::json))
select id,json_object_keys(json_array_elements(data)) = '279864' from c;
id | ?column?
----+----------
1 | f
1 | f
1 | t
1 | f
(4 rows)
, чтобы вы могли проверить с помощью WHERE EXISTS
или count(*) > 0
или любым другим способом, который вам нравится ...
например, с bool_or
(если хотя бы одинверно, группа истинна):
t=# with c(id,data) as (values(1,'[{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]'::json))
, m as (select id,(json_object_keys(json_array_elements(data)) = '279864')j from c)
select id, bool_or(j) from m group by id;
id | bool_or
----+---------
1 | t
(1 row)
Короче говоря:
- используйте
json_array_elements
для разделения массива для проверки. - используйте
json_object_keys
чтобы получить ключ элемента разделенного массива - , используйте bool_or, чтобы проверить, является ли хотя бы один ключ похожим на шаблон
update , поскольку OP запрашивает "менее сложный"Решение, я также публикую взлом обезьяны:
t=# with c(id,data) as (values(1,'[{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]'::json))
select * from c where data::jsonb::text ~ '(,)|({ )"279863":';
id | data
----+-----------------------------------------------------------------------------------------------------
1 | [{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]
(1 row)
, что, конечно, очень скользко и требует некоторого объяснения:
- Мне нужно привести к
jsonb
во-первых, чтобы исключить возможную свободу синтаксиса - ключи объекта json не отсортированы, поэтому мне нужно отловить оба случая
{
{и ,