首页 > 解决方案 > 如何在 postgres 中循环 JSON 数组并访问 JSON 的密钥?

问题描述

我有一个带有几个键值对的自定义 json。我想遍历数组的长度,访问它们的每个键,然后插入到表中。我面临的问题是在循环期间查询无法访问该值。

do $$
DECLARE
DECLARE fname varchar;
DECLARE lname varchar;
DECLARE StartDate timestamp;
DECLARE EndDate timestamp;
DECLARE DateText varchar;
DECLARE uniqueData jsonb = '[
    {
        "fname": "PERFFBB",
        "lname": "PERFE59-AB1899A-A8CAE59-AB1899A-AB1899A-AB1899A-AB1899A-A8CAE59"
    },
    {
        "fname": "PERFD34",
        "lname": "PERFCD5-232D322-BD88CD5-232D322-232D322-232D322-232D322-BD88CD5"
    },
]';
begin for r in 1..(jsonb_array_length(uniqueData) - 1)
loop 
fname = uniqueData[r].fname;
lname = uniqueData[r].lname;
-- this is giving a problem. It is unable to access the key.
for z in 1..2 
loop 
StartDate = current_date::timestamp - concat(z, ' day')::interval;
EndDate = current_date::timestamp - concat(z - 1, ' day')::interval - interval '1 seconds';
DateText = (
    to_char(
        'now'::timestamp - concat(z, ' day')::interval,
        'Mon DD, YYYY'
    )
);
INSERT INTO table (
        col1,
        col2,
        col3,
        col4,
        col5
    )
values (
        fname,
        lname,
        StartDate,
        EndDate,
        DateText
    );
end loop;
end loop;
end;
$$;

标签: sqlpostgresql

解决方案


jsonb 数组上的循环将如下所示

DECLARE var1 RECORD;
...
FOR var1 IN
  SELECT * FROM jsonb_to_recordset(uniqueData) as x(fname text, lname text)
LOOP
  -- var1 contains fname and lname fields
  fname = var1.fname;
  lname = var1.lname;

  .....

END LOOP;

推荐阅读