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变量的情况下执行此操作。
只是:
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,而不是数组
| 归档时间: |
|
| 查看次数: |
13150 次 |
| 最近记录: |