0

次のpostgres機能について助けが必要です

列を含む次の表があります。

array, array_length

最初にいくつかの配列があり、次に配列を選択して追加し、追加した配列をテーブルに挿入するクエリ (実際には 3 つのクエリのセット) を実行します。

select max(array_length) from table配列の 1 つ ( ) が定義済みのサイズ (長さ 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のマニュアルを見ましたが、 役立つものは何も見つかりませんでした。

私を正しい方向に向けるヒントやリンクをいただければ幸いです。ありがとうございました。

編集:試してみました

CREATE OR REPLACE FUNCTIOn function_name() RETURNS int4 AS ' DECLARE r RECORD;

BEGIN WHILE (super_item から max(array_length) を選択)<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;

1 を返します。終わり; ' LANGUAGE plpgsql;

出力として function_name() を選択します。

現在、引用符で囲まれた区切り文字である必要がある関数引数に対して「不明な列」というエラーが発生しています。

エラー: 列 „,“ 存在する nicht LINE 18: on string_to_array(b.item1::text, ",")::int[] <@ a.new_ar...

4

1 に答える 1