スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PL/pgSQLで数値を3桁区切り文字列に変換

PostgreSQLで数値を3桁区切りにして表示するには
SELECT to_char(1234, '9,999')
→1,234
のようにやります。
しかし、この方法ではあらかじめ桁数がわかって無いとできません。
ということで、任意の数値を渡して3桁区切りするPL/pgSQLを書いてみます。

CREATE OR REPLACE FUNCTION to_three_split(
p_src text
) RETURNS text AS $$
DECLARE
w_work text;
w_length int;
w_result text := '';
w_sign text := '';
BEGIN
IF p_src IS NULL OR '' = p_src THEN
RETURN '';
END IF;
IF '-' = substring(p_src from 1 for 1) THEN
w_sign := '-';
w_work := substring(p_src from 2 for char_length(p_src) - 1);
ELSE
w_work := p_src;
END IF;
w_length := char_length(w_work);
FOR i IN 0..w_length-1 LOOP
IF 0 = i % 3 AND 0 <> i THEN
w_result := ',' || w_result;
END IF;
w_result := substring(w_work from w_length - i for 1) || w_result;
END LOOP;
RETURN w_sign || w_result;
END;
$$ LANGUAGE plpgsql;

引数は数値よりも文字列の方が汎用性があるので、文字列にしました。
使い方は以下の通りです。

SELECT to_three_split('123456789');
→"123,456,789"
SELECT to_three_split('-123456789');
→"-123,456,789"
SELECT to_three_split(123456789::text);
→"123,456,789"
SELECT to_three_split((-123456789)::text);
→"-123,456,789"

数値カラムの場合プラスでもマイナスでも
SELECT to_three_split(column::text) FROM t_table;
のように呼び出すことができます。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。