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
