PostgreSQL 動的カラム ストアドファンクション
このところストアドファンクションで動的カラムに対応すべく格闘中。
n_idは、グループの管理id s_idは、グループ毎のid sectorは、区間名 下記、トリガーはsectorが1件入力される毎に s_idに自動採番するトリガー関数。 CREATE TABLE sector ( id serial NOT NULL, s_id integer, sector character(6), n_id integer, f_id integer, CONSTRAINT sector_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE sector OWNER TO yu2admin; CREATE TRIGGER s_id_insert BEFORE INSERT ON sector FOR EACH ROW EXECUTE PROCEDURE assign_s_id(E'\\x5c7800');
テーブルsector id s_id sector n_id f_id ------------------------------ 25 1 4P 11 1 26 2 9P 11 1 27 3 GP 11 1
上記、テーブルsectorのn_id毎にグルーピングされた
sectorフィールド分のカラムを動的に生成するストアドファンクションがこれ↓
/* 縦持ちフィールドデータを利用して、横持カラムにするストアドファンクション */ CREATE OR REPLACE FUNCTION var_col_function(key integer) RETURNS text AS $$ DECLARE var_col text; BEGIN SELECT array_to_string(array_agg('S' || sector), ', ') INTO var_col FROM sector WHERE n_id = key; RETURN var_col; END; $$ LANGUAGE plpgsql;
/* 一時テーブルを作成するストアドファンクション */ CREATE OR REPLACE FUNCTION create_tmp_records1(var_col text) RETURNS VOID AS $$ BEGIN EXECUTE 'CREATE TEMP TABLE tmp_records1 (id integer, ' || var_col || ', n_id integer, PRIMARY KEY (id)) ON COMMIT DROP;'; END; $$ LANGUAGE plpgsql;
/* ストアドファンクションの実行 */ SELECT create_tmp_records1(var_col_function('11'));
/* 実行結果 */ 1 row; id, S4P, S9P, SGP