迭代postgresql中的json数组元素

时间:2018-05-16 09:59:50

标签: sql json postgresql plpgsql

我有一个看起来像这样的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 :(得分:1)

只是:

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 returns setof,而不是数组

答案 1 :(得分:0)

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')

可能工作得更慢(表格将像以前一样创建,然后将被转换)