次の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...