如何在 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时,这是推荐的数据类型。
下面的代码是一个 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时,这是推荐的数据类型。