如何在 postgresql 中获取 json 数组

how to fetch json array in postgresql

下面的代码是一个 json 参数。如何获取角色详细信息。我需要获取角色数组的 ID。

'{
            "id": 1,
            "firstName": "test",
            "lastName": "user",
            "email": "mail@gmail.com",
            "roles": [
                {
                    "id": 2,
                    "roleName": "DBUser"
                },
                {
                    "id": 1,
                    "roleName": "Admin"
                }
            ]
        }'::json

我写的函数如下。但我无法将数据插入用户角色 table.

CREATE OR REPLACE FUNCTION public.Save_User(json_data json)
 RETURNS integer
 LANGUAGE plpgsql
AS $function$
declare
    v_id integer;
i json;
BEGIN

    FOR i IN
    SELECT *
    FROM json_array_elements(json_data) loop
    INSERT INTO users (firstname, lastname, email)
    VALUES (i ->>'FirstName',
            i ->>'LastName',
            i ->>'Email') RETURNING id
    INTO v_id;
--for roles
    FOR i IN
    SELECT *
    FROM json_array_elements(json_data->'roles') loop
    INSERT INTO userroles (userid, roleid) 
    VALUES (v_id,
            i ->>'Id');
    END LOOP;
--end
END LOOP;
RETURN v_id;
END;
$function$
;

所以我需要向用户角色插入数据 table。

你不需要任何循环。

第一个 INSERT 的 SELECT 是错误的,因为您传递的值不是数组。您只需要直接从传递的参数访问属性。由于这是单行,因此不需要循环开始。

要插入角色,您也不需要循环,只需使用 jsonb_array_elements() 作为 INSERT 语句的来源:

create function save_user(p_user_data jsonb)
  returns int
as
$$
declare
  v_id int;
begin
  insert into users (firstname, lastname, email)
  select p_user_data ->> 'firstName', 
         p_user_data ->> 'lastName',
         p_user_data ->> 'email'
  returning id
  into v_id;
    
  insert into userroles (userid, roleid)
  select v_id, (r.item ->> 'id')::int
  from jsonb_array_elements(p_user_data -> 'roles') as r(item);

  return v_id;
end;  
$$
language plpgsql;

我在这里使用jsonb而不是json,因为当涉及JSON时,这是推荐的数据类型。

Online example