我创建了一个postgresql函数,它以逗号分隔的id列表作为输入参数。然后我将这个以逗号分隔的列表转换为数组。
CREATE FUNCTION myFunction(csvIDs text)
RETURNS void AS $$
DECLARE ids INT[];
BEGIN
ids = string_to_array(csvIDs,',');
-- INSERT INTO tableA
END; $$
LANGUAGE PLPGSQL;
我现在要做的是,如果表中没有ID,则将每个id(在数组中)的记录插入到表A中。新记录的值字段应设置为0。
表格就是这样创建的
CREATE TABLE TableA (
id int PRIMARY KEY,
value int
);
这可能吗?
答案 0 :(得分:1)
您可以使用unnest()函数获取数组的每个元素。
create table tableA (id int); insert into tableA values(13);
select t.ids from (select unnest(string_to_array('12,13,14,15', ',')::int[]) ids) t
| ids | | --: | | 12 | | 13 | | 14 | | 15 |
现在,您可以在插入新行之前检查ids
值是否存在。
CREATE FUNCTION myFunction(csvIDs text) RETURNS int AS $myFunction$ DECLARE r_count int; BEGIN insert into tableA select t.ids from (select unnest(string_to_array(csvIDs,',')::int[]) ids) t where not exists (select 1 from tableA where id = t.ids); GET DIAGNOSTICS r_count = ROW_COUNT; return r_count; END; $myFunction$ LANGUAGE PLPGSQL;
select myFunction('12,13,14,15') as inserted_rows;
| inserted_rows | | ------------: | | 3 |
select * from tableA;
| id | | -: | | 13 | | 12 | | 14 | | 15 |
dbfiddle here