迭代postgresql中的json数组元素

lap*_*ots 3 sql postgresql json plpgsql

我有一个看起来像这样的 json

{
    "elements": [ "element1", "element2", "element3" ]
}
Run Code Online (Sandbox Code Playgroud)

我想迭代它的元素并打印它们。我这样做

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;
$$;
Run Code Online (Sandbox Code Playgroud)

但它因错误而失败query select jsonb_array_elements(datajson->'elements') returned more than one row

问题是什么?

更新

尝试了这个建议:

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

但这只是给出了一个语法错误:

ERROR:  42601: syntax error at or near "SELECT"
LINE 7:     SELECT array_agg(jsonb_array_elements) FROM jsonb_array_...
            ^
LOCATION:  scanner_yyerror, scan.l:1134
Run Code Online (Sandbox Code Playgroud)

尝试在不使用FOR r IN (...)和声明RECORD变量的情况下执行此操作。

Vao*_*sun 7

只是:

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)
Run Code Online (Sandbox Code Playgroud)

但如果你想提高它:

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
Run Code Online (Sandbox Code Playgroud)

我假设您将 json 数组与 postgres 数组混淆了 - 它们不一样。并jsonb_array_elements 返回 setof,而不是数组