我有一个看起来像这样的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
。
有什么问题?
答案 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')
但可能工作得更慢(表格将像以前一样创建,然后将被转换)