SQLで文字列をsumするには

/ db

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