PostgreSQL: извлечение информации c из json - PullRequest
0 голосов
/ 22 апреля 2020

Я использую PostgreSQL 9.6, и у меня есть следующая таблица, назовем ее table1:

id  | json_data
____________________
200 | {"state": [3, 4, 5]}

Я хочу иметь возможность выполнить следующий запрос: извлечь массив внутри "state" введите json_data для записи с идентификатором 1, но также удалите некоторые целые числа из массива в процессе.

Например (в псевдокоде):

extract_state(id = 200, remove_numbers_from_json_data_state = [3, 5]) должен вернуть [4]

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Для этого нет встроенной функции, но вы можете легко написать свою собственную:

create function remove_numbers(p_array jsonb, p_nr variadic int[] )
returns jsonb
as
$$
  select jsonb_agg(x)
  from jsonb_array_elements(p_array) as t(x)
  where t.x::int <> ALL(p_nr);
$$
language sql
immutable;

Тогда вы можете использовать ее так:

select id, remove_numbers(json_data -> 'state', 4,5)
from t1
where id = 1;

Если вы предпочитаете чтобы передать значение массива JSON, вы можете определить функцию следующим образом:

create function remove_numbers(p_array jsonb, p_to_remove jsonb)
returns jsonb
as
$$
  select jsonb_agg(x)
  from jsonb_array_elements(p_array) as t(x)
  where t.x not in (select *
                    from jsonb_array_elements(p_to_remove))
$$
language sql;

Тогда вам нужно будет использовать remove_numbers(json_data -> 'state', '[4,5]')

0 голосов
/ 23 апреля 2020

Вы бы использовали запрос, подобный следующему:

SELECT json_data->'state'->>1 FROM table1 WHERE id = 200;

Вы можете проверить этот способ без таблицы:

SELECT '{"state": [3, 4, 5]}'::jsonb->'state'->>1

Вот справочник по использованию JSON в Postgres: https://www.postgresql.org/docs/current/functions-json.html

Возвращает 4, а не [4], поэтому, если вам нужно, вы можете выбрать его в виде массива:

SELECT ARRAY[('{"state": [3, 4, 5]}'::jsonb->'state'->>1)::int]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...