如何将值列表拆分为变量,以及如何使插入函数在postgreSQL中的for each循环下工作
我有两张桌子 党派主义者 名单 这是完整的 我想调用一个可以将值插入两个表的函数。 我的输出应该是这样的。 partyList表 列表表 当我通过以下示例中的这些值调用函数时如何将值列表拆分为变量,以及如何使插入函数在postgreSQL中的for each循环下工作,sql,postgresql,postgresql-9.1,plpgsql,postgresql-9.2,Sql,Postgresql,Postgresql 9.1,Plpgsql,Postgresql 9.2,我有两张桌子 党派主义者 名单 这是完整的 我想调用一个可以将值插入两个表的函数。 我的输出应该是这样的。 partyList表 列表表 当我通过以下示例中的这些值调用函数时 insert_function('games','indoor stadium','08-10-2013','ronald;sania;sachin;pointing;samueal;gibbs;gayle;smith;','100;200;100;100;200;100;100;100;'), ('dance','sta
insert_function('games','indoor stadium','08-10-2013','ronald;sania;sachin;pointing;samueal;gibbs;gayle;smith;','100;200;100;100;200;100;100;100;'),
('dance','stage','08-15-2013','micheal jakson; britney ; daddy yankee; ar rehaman; jestin bebber;','200;100;100;200;100;');
是否有方法将列表项拆分为整数并在循环中调用列表表的插入查询?您可以使用函数:
CREATE OR REPLACE FUNCTION insert_party(
_title text, _venue text, _date date,
_list text, _Amount_list text
)
RETURNS void AS
$BODY$
begin
with cte as (
insert into partyList(Party_title, Party_venue, Party_date, Party_list, Amount_list)
values (_title, _venue, _date, _list, _Amount_list)
returning sno
), cte2 as (
select
sno,
regexp_split_to_table(_list, ';') as participant_name,
regexp_split_to_table(_Amount_list, ';') as amount_paid
from cte
)
insert into list (sno, participant_name, amount_paid)
select sno, participant_name, amount_paid::int
from cte2
where participant_name is not null and participant_name <> '';
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
实际上,可以将此函数编写为SQL而不是plpgsql,正如您所看到的,它只是一条语句。它帮助了我!谢谢你:-我正在处理这类主题本身,如果我对此不清楚,那么我会发短信给你。我们可以将返回的sno值存储到一个变量中吗,因为这有助于我在作业中更进一步。谢谢,我正在尝试插入两列列表中的值。在这两列列表之间要做很多比较。一旦我清楚地了解了我的流程,我会要求你提供指导方针。如果在这个senario中我有一个整数列表,那么如何将它们拆分并插入到另一个表中..我编辑了这个问题?我尝试在查询中进行一些更改,但遇到一个错误:列amount\u paid的类型为integer,但表达式的类型为text^提示:您需要重写或强制转换表达式。
| SNO | PARTY_TITLE | PARTY_VENUE | PARTY_DATE | PARTY_LIST | |AMOUNT_LIST
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 1 | games | indoor stadium | August, 10 2013 00:00:00+0000 | ronald;sania;sachin;pointing;samueal;gibbs;gayle;smith; | 100;200;100;100;200;100;100;100; |
| 2 | dance | stage | August, 15 2013 00:00:00+0000 | micheal jakson; britney ; daddy yankee; ar rehaman; jestin bebber; |200;100;100;200;100; |
| SNO | PARTICIPANT_NAME | AMOUNT_lIST
---------------------------------------
| 1 | ronald | 100
| 1 | sania | 200
| 1 | sachin | 100
| 1 | pointing | 100
| 1 | samueal | 200
| 1 | gibbs | 100
| 1 | gayle | 100
| 1 | smith | 100
| 2 | micheal jakson | 200
| 2 | britney | 100
| 2 | daddy yankee | 100
| 2 | ar rehaman | 200
| 2 | jestin bebber | 100
insert_function('games','indoor stadium','08-10-2013','ronald;sania;sachin;pointing;samueal;gibbs;gayle;smith;','100;200;100;100;200;100;100;100;'),
('dance','stage','08-15-2013','micheal jakson; britney ; daddy yankee; ar rehaman; jestin bebber;','200;100;100;200;100;');
CREATE OR REPLACE FUNCTION insert_party(
_title text, _venue text, _date date,
_list text, _Amount_list text
)
RETURNS void AS
$BODY$
begin
with cte as (
insert into partyList(Party_title, Party_venue, Party_date, Party_list, Amount_list)
values (_title, _venue, _date, _list, _Amount_list)
returning sno
), cte2 as (
select
sno,
regexp_split_to_table(_list, ';') as participant_name,
regexp_split_to_table(_Amount_list, ';') as amount_paid
from cte
)
insert into list (sno, participant_name, amount_paid)
select sno, participant_name, amount_paid::int
from cte2
where participant_name is not null and participant_name <> '';
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;