перебирать элементы массива json в postgresql - PullRequest
0 голосов
/ 16 мая 2018

У меня есть json, который выглядит следующим образом

{
    "elements": [ "element1", "element2", "element3" ]
}

Я хочу перебрать его элемент и напечатать его.Я делаю это так

do $$
declare
    datajson jsonb := '{
        "elements": [ "element1", "element2", "element3", "element4" ]
    }';
    element varchar(128);
begin
    foreach element in array jsonb_array_elements(datajson->'elements')
    loop
        raise notice '%', element;
    end loop;
end;
$$;

Но не получается с ошибкой query select jsonb_array_elements(datajson->'elements') returned more than one row.

В чем проблема?

Ответы [ 2 ]

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

jsonb_array_elements() возвращает элементы массива в виде таблицы, а не в виде массива.

Используйте

FOR element IN
    SELECT jsonb_array_elements FROM jsonb_array_elements(datajson->'elements')

для перебора строк таблицы, а не массива.

Или используйтеarray_agg() для преобразования таблицы в массив:

FOREACH element IN ARRAY
    SELECT array_agg(jsonb_array_elements) FROM jsonb_array_elements(datajson->'elements')

, но может работать медленнее (таблица будет создана, как в предыдущем случае, а затем будет преобразована)

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

just:

so=# with c(j) as (values('{
    "elements": [ "element1", "element2", "element3" ]
}'::jsonb))
select jsonb_array_elements(j->'elements') from c;
 jsonb_array_elements
----------------------
 "element1"
 "element2"
 "element3"
(3 rows)

но если вы хотите повысить его:

so=# do $$
declare
    datajson jsonb := '{
        "elements": [ "element1", "element2", "element3", "element4" ]
    }';
    element varchar(128);
    r record;
begin
    for r in (select jsonb_array_elements(datajson->'elements') element)
    loop
        raise notice '%', r.element;
    end loop;
end;
$$;
NOTICE:  "element1"
NOTICE:  "element2"
NOTICE:  "element3"
NOTICE:  "element4"
DO

Я полагаю, вы путаете массив json с массивом postgres - они не совпадают.И jsonb_array_elements возвращает setof , а не массив

...