Извлечение значения из объекта Json Array в Postgres - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в Postgres, поэтому застрял при создании запроса.

Определение таблицы:

id - primary key,
data - JSON

Пример данных:

id       data
--------------------------------------------------------------
1           [{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]

Я хочу найти ключ (279864) в моем столбце данных, используя предложение where

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

сделать столбец данных как JSONB, и тогда вы можете легко сделать это, используя:

SELECT * FROM table WHERE data->>'279863' IS NOT NULL;
0 голосов
/ 28 мая 2018
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)

Короче говоря:

  1. используйте json_array_elements для разделения массива для проверки.
  2. используйте json_object_keysчтобы получить ключ элемента разделенного массива
  3. , используйте 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)

, что, конечно, очень скользко и требует некоторого объяснения:

  1. Мне нужно привести к jsonbво-первых, чтобы исключить возможную свободу синтаксиса
  2. ключи объекта json не отсортированы, поэтому мне нужно отловить оба случая {,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...