繁体   English   中英

PostgreSQL函数如果条件,然后运行查询,否则停止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM