SQLでカラムを超えて文字列を結合する場合は、||
演算子を使えば良いけれども、レコードを超えて文字列を結合する場合はどうしたもんか。
イメージとしては、数値をSUMするような感じで、文字列を縦結合していく感じ。
しかし、sum(integer)はあっても、sum(text)は見当たらない。ということで、自分で作ってみた。初めてのオリジナル集約関数。わーい。(PostgreSQL限定)
あ、先に断っておきますが、PostgreSQL限定ですので、他DBの方はごめんなさい。
CREATE OR REPLACE FUNCTION sum(text,text) RETURNS text as $BODY$ -- 現在の状態値と現在の入力データ項目を受け取り、次の状態値を返す DECLARE state alias for $1; -- 状態値 input_data alias for $2; -- 入力値 BEGIN IF state IS NULL THEN RETURN input_data; ELSIF input_data IS NULL THEN RETURN state; ELSE RETURN state || ',' || input_data; END IF; END $BODY$ LANGUAGE 'plpgsql' VOLATILE;
-- 集約関数 CREATE AGGREGATE sum(basetype = text, sfunc = sum, stype = text);
上記SQLで関数を作ってしまえば、あとは数値のときと同じ流れで、文字列をSUMするだけ。
product_id | product_name ------------+-------------- 1 | みかん 2 | りんご
というテーブルに対して、
SELECT sum(product_name) FROM product;
sum --------------- みかん,りんご
という結果が得られる。わー、我ながら便利。
ちなみに縦結合する際の区切り文字をカンマ以外のもの(例えば、改行とか)に変えたり、もしくは区切り文字をなくしてしまいたい場合は、上記関数14行目の「','」あたりを直すことで、幸せになれると思います。
以上、お疲れさまでした。
このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/434