Как ДОБАВИТЬ и УДАЛИТЬ в новом элементе json-array в PostgreSQL V9.4 - PullRequest
0 голосов
/ 03 октября 2019

Я делаю цикл для создания новой матрицы json только с определенными элементами, для этого мне нужно пройти через ранее созданный массив json и PUSH (ADD ELEMENT) и POP (REMOVE ELEMENT) элементы в соответствии сусловие.

Я получаю что-то подобное

[
{"id":1 , "data": "test_a"},
{"id":2 , "data": "test_t"},
{"id":3 , "data": "test_h"},
.....
]

и я делаю что-то подобное с циклом

DECLARE
_test       json;
i           json;
_new_jsn    json;
BEGIN
_test := SELECT json_agg(json_build_object('id', 1, 'data', 'test'))

        FOR i IN SELECT * FROM json_array_elements(_test) LOOP


            RAISE NOTICE 'element %',i;
        END LOOP;

Отсюда я не знаюкак продолжить, чтобы сделать ДОБАВИТЬ и УДАЛИТЬ элемент в новом параметре.

Мой фильтр основан на IF-ELSE, поэтому, если у меня есть

       FOR i IN SELECT * FROM json_array_elements(_test) LOOP
         IF i->>id > 2 THEN
         ..... Add the element in _new_jsn
         ELSE
         .... Remove/Ignore the element
         END IF; 
        END LOOP;

, я хочу получить после циклакак то так

[
{"id":3 , "data": "test_h"},
{"id":4 , "data": "test_c"},
.....
]

1 Ответ

0 голосов
/ 03 октября 2019

Я полагаю, что вы ищете

DECLARE
  test CONSTANT json := json_build_array(
   json_build_object('id', 1, 'data', 'test_a'),
   json_build_object('id', 2, 'data', 'test_t'),
   json_build_object('id', 3, 'data', 'test_h'),
   json_build_object('id', 4, 'data', 'test_c')
  );
  result json;
BEGIN
  result := (SELECT json_agg(el)
    FROM json_array_elements(test) AS t(el)
    WHERE (el->>'id')::int > 2);
  -- …
END;

Вам не нужно никаких циклов или IF операторов здесь. Просто запрос SELECT с предложением WHERE.

Онлайн-демонстрация (я не нашел лучшего способа вывести результат, чем вызвать исключение: - /)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...