[英]Postgresql function If condition then run query else stop
我需要以下Postgres功能的帮助
我有下表的列:
array, array_length
我最初有几个数组,然后运行查询(实际上是3个查询的集合),该查询选择数组,将其追加,然后将追加的数组插入表中。
我需要循环此插入查询,直到数组之一( select max(array_length) from table
)达到预定义的大小,例如长度50。
我基本上需要写类似
begin
for (select max(array_length) from table)<50
loop
(drop table if exists super_item_temp;
ALTER TABLE super_item
RENAME TO super_item_temp;
create table super_item as
select distinct * from super_item_temp;
insert into super_item
select ...calculations... from super_item)
end
但是我找不到正确的语法来写这个
我在http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html上查看了该手册,但找不到任何有用的信息。
任何指向我正确方向的提示或链接将不胜感激! 谢谢。
编辑:我试过
创建或替换功能function_name()返回int4作为'DECLARE r RECORD;
开始时(从super_item中选择max(array_length)max)
loop
drop table if exists super_item_temp;
ALTER TABLE super_item
RENAME TO super_item_temp;
create table super_item as
select distinct * from super_item_temp;
insert into super_item
select old_array,
array_sort_unique( array_agg(added_item) || a.old_array) as new_array,
array_length(array_sort_unique( array_agg(added_item) || a.old_array),1)
from (
select
a.new_array as old_array,
case when string_to_array(b.item2::text, ",")::int[] <@ a.new_array and string_to_array(b.item1::text, ",")::int[] <@ a.new_array then null
when string_to_array(b.item2::text, ",")::int[] <@ a.new_array then b.item1 else b.item2 end as added_item
from
super_item a
left join pairs b
on string_to_array(b.item1::text, ",")::int[] <@ a.new_array or string_to_array(b.item2::text, ",")::int[] <@ a.new_array /**any item from pair is in array**/
where 1=1
group by a.new_array, 2
having sum(b.count)>10
and sum(b.offset)<=0
and
case
when string_to_array(b.item2::text, ",")::int[] <@ a.new_array and string_to_array(b.item1::text, ",")::int[] <@ a.new_array then null
when string_to_array(b.item2::text, ",")::int[] <@ a.new_array then b.item1 else b.item2 end is not null
/**new item is not null**/
order by 2 desc
)a
group by 1;
END LOOP;
返回1; 结束; '语言plpgsql;
SELECT function_name()作为输出;
现在,我收到一个函数参数错误“未知列”,该参数应为带引号的分隔符。
错误:列„,“列第18行:在string_to_array(b.item1 :: text,“,”):: int [] <@ a.new_ar ...
尝试一下,在我的PC上它可以正常编译(但是我不知道它是否按预期工作)。
CREATE OR REPLACE FUNCTION append_super_item ()
RETURNS integer AS $length$
declare
length integer;
BEGIN
WHILE (select max(array_length) from super_item)<50
LOOP
drop table if exists super_item_temp;
ALTER TABLE super_item
RENAME TO super_item_temp;
Create table super_item as
select distinct * from super_item_temp;
insert into super_item
select old_array,
array_sort_unique( array_agg(added_item) || a.old_array) as new_array,
array_length(array_sort_unique( array_agg(added_item) || a.old_array),1)
from (
select
a.new_array as old_array,
case when string_to_array(b.item2::text, ",")::int[] <@ a.new_array and string_to_array(b.item1::text, ",")::int[] <@ a.new_array then null
when string_to_array(b.item2::text, ",")::int[] <@ a.new_array then b.item1 else b.item2 end as added_item
from
super_item a
left join pairs b
on string_to_array(b.item1::text, ",")::int[] <@ a.new_array or string_to_array(b.item2::text, ",")::int[] <@ a.new_array /**any item from pair is in array**/
where 1=1
group by a.new_array, 2
having sum(b.count)>10
and sum(b.offset)<=0
and
case
when string_to_array(b.item2::text, ",")::int[] <@ a.new_array and string_to_array(b.item1::text, ",")::int[] <@ a.new_array then null
when string_to_array(b.item2::text, ",")::int[] <@ a.new_array then b.item1 else b.item2 end is not null
/**new item is not null**/
order by 2 desc
)a
group by 1;
end loop;
end $length$ LANGUAGE plpgsql;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.