数値をカンマで区切る自作関数

数字を「1000000」ではなく、カンマ区切りで「1,000,000」と表示します。

※ このページでは関数を紹介しますが、書式設定の実例はこちらで紹介しています。

 

引数

引数1(numeric):カンマ区切りにする数値

 

返り値

カンマ区切りした文字列

 

コード

CREATE OR REPLACE FUNCTION commaseparated(
    numeric)
  RETURNS character varying AS
$BODY$
declare

	i_target	alias for $1; 	--引数1:対象の数値
	
BEGIN
	
	return to_char(i_target, 'fm999,999,999,999,999'); 
	
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION commaseparated(numeric)
  OWNER TO postgres;

 

実行例

select * from commaseparated(1234567890);
--1,234,567,890

 

他にもこんな関数があります(数値操作の関数)

数値であるかのチェック(IsNumeric)

四捨五入(Round)

消費税を計算する(8%、10%対応)

ランダム値を生成する(Rand)

Decode関数

検索文字を後ろから検索する(LastIndexOf)

指定した文字列が含まれるかどうかを文字列の最後から検索し、その位置を返す関数です。

 

引数

引数1(character varying):検索先の文字列(この文字列から引数2の文字を探す)

引数2(character varying):探す文字列

 

返り値

探す文字列が見つかった位置(○○文字目)

※ なかった場合は0が返る

 

コード(そのまま実行できます)

CREATE OR REPLACE FUNCTION lastindexof(
   c_target_char character varying,
   c_search_char character varying)
  RETURNS integer AS
$BODY$
declare

	c_tmp 		character varying;
	i_result 	integer;
	i_length	integer;

BEGIN

	--引数1がNullまたは空なら0でリターン
	if (c_target_char is null) or (c_target_char= '') then
		return 0;
	end if;

	--引数2がNullまたは空なら0でリターン
	if (c_search_char is null) or (c_search_char = '') then
		return 0;
	end if;

	i_length = length(c_target_char);
	c_target_char = reverse(c_target_char);
	c_search_char = reverse(c_search_char);

	c_tmp = substr(c_target_char, 0, length(c_target_char) + 1);
	i_result = strpos(c_tmp, c_search_char);

	IF i_result != 0 THEN
		--見つかった場合:その位置をリターン
		RETURN i_length - i_result + 1;
	ELSE
		--見つからなかった場合:0でリターン
		RETURN 0;
	END IF;

	return 0;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例

--探す文字列があった場合は、最初に見つかった位置が返る
select lastindexOf('abcabcabc', 'b')   --【結果】:8

--探す文字列がない場合は、0が返る
select lastindexOf('abcabcabc', 'de')  --【結果】:0

 

構文

型を変換するにはcast(キャスト)を使用します。

-- 型を変換する
cast( A as B )    -- Aを型Bに変換する

A: 型変換をする文字・数字・日付など

B: 変換したい型を指定します。

※ castではなく「'123'::integer」、「123::text」のように「::型」で表現する方法もありますが、

こちらにあるとおり同じ意味です。

 

B(変換したい型)に設定する代表的な型

 型  代表例
 文字型  character(桁数) , character varying , text
 数値型  integer , numeric
 日付型  date , timestamp
 論理型  boolean

 

 

 

文字から数値へ変換する例

文字から数値へ変換する例です。SELECT文はそのまま実行できます。

-- '0123'をintegerへ変換する
select cast('0123' as integer);     -- 123

-- '0123.45'をnumericへ変換する
select cast('0123.45' as numeric);  -- 123.45

-- 小数点第何位までで変換
-- numericの左の数値は全体の桁数、右は小数点の桁数
SELECT cast('1234567.345' as numeric(10,2) );  -- 小数点第2位まで:1234567.35
SELECT cast('1234567.345' as numeric(10,3) );  -- 小数点第3位まで:1234567.345
SELECT cast('1234567.345' as numeric(12,5) );  -- 小数点第5位まで:1234567.34500

-- マイナス値
SELECT cast('-123456.789' as numeric);        -- -123456.789
SELECT cast('-123456.789' as numeric(8,2) );  -- -123456.79

-- 'abc'をintegerへ変換する
select cast('abc' as integer);      -- エラーが発生

--上の例は、次のようにも書くこともできます(同じ意味です)
select '0123'::integer;             -- 123
select '0123.45'::numeric;          -- 123.45
select 'abc'::integer;              -- エラー

 

あわせて読みたい

数値でないものを変換する可能性がある場合は、事前チェックが必要です。

https://postgresweb.com/post-5440

 

 



 

 

数値から文字へ変換する

数値から文字へ変換する例です。SELECT文はそのまま実行できます。

-- 12345をcharacter varyingへ変換する
select cast(12345 as character varying);     -- '12345'

-- 12345をcharacter varying(3)へ変換する
select cast(12345 as character varying(3));  -- '123'

-- 45678をtextへ変換する
select cast(45678 as text);                  -- '45678'

 

 

 

関連記事

文字型の型について整理してみました

代表的な数値型の型について整理してみました

前0埋め、後ろ0埋め(lpad、rpad)

数値の書式設定をする

文字を日付に変換する

ランダム値を生成する自作関数(Rand)

ランダムな値を生成する(範囲指定あり)

 

引数

引数1(integer):ランダム値の範囲(最大値)

引数2(integer):ランダム値の範囲(最小値)

 

返り値

ランダム値(整数値)

 

コード

CREATE OR REPLACE FUNCTION rand(i_min integer,i_max integer)
  RETURNS numeric AS
$BODY$
declare
BEGIN

	return round(( random() * (i_min - i_max) )::numeric, 0) + i_max;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION rand(integer,integer)
  OWNER TO postgres;

※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例

--1から100の範囲でランダム値を生成する
select * From rand(1 , 100);        --結果:50

--1,000から10,000の範囲でランダム値を生成する
select * From rand(1000 , 10000);   --結果:5000

 

PostgreSQLの構文まとめを書いています

入門~経験者まで「基本構文・こんな時どう書くんだっけ?」のまとめ

説明

ある文字列の中で、指定した文字列が最初に出現する位置を返す自作関数です。

 

 

引数

引数1(character varying):ある文字列(この文字列の中から特定の文字を探します)

引数2(character varying):探す文字列

 

 

返り値

文字位置(数値)

 

 

コード

CREATE OR REPLACE FUNCTION indexof(
	c_target_char character varying,
	c_search_char character varying)
    RETURNS integer LANGUAGE 'plpgsql' COST 100 VOLATILE 
AS $BODY$
declare
BEGIN

	--文字列と検索文字列が空かnullなら0とする
	if (c_target_char is null) or (c_target_char= '') then
		return 0;
	end if;
	if (c_search_char is null) or (c_search_char = '') then
		return 0;
	end if;

	RETURN strpos(c_target_char, c_search_char);

END;
$BODY$;

※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

あわせて読みたい

この自作関数で使用している「検索文字位置の取得(strpos)」は、こちらで紹介しています。

https://postgresweb.com/post-4129

 

 

実行例

 select indexOf('abcdefgh', 'f');  --【結果】:6

 

ひらがなをカタカナに変換、置換する

ひらがなをカタカナに置換します(translateを使用)。

(自作関数が必要なく)SELECT文だけ必要な人この記事の下部へ

 

あわせて読みたい

カタカナ→ひらがなの置換はこちらです

https://postgresweb.com/post-184

 

引数

引数1(character varying):置換する文字列

 

返り値

置換した文字列

 

コード

CREATE OR REPLACE FUNCTION convert_hiragana_to_katakana(character varying)
  RETURNS character varying AS
$BODY$
declare
	c_hiragana	alias for $1;      --引数1:置換する文字列
	c_katakana	character varying;

begin

	return
	translate(
		c_hiragana,
		'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゕゖ',
		'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ'
	);

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION convert_hiragana_to_katakana(character varying)
  OWNER TO postgres;

※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例

select * From convert_hiragana_to_katakana('あいうえお');
--【結果】アイウエオ

 

(自作関数が必要ない人向け)SELECT文のみの紹介

SELECT文だけ必要な人向けです。次のSELECT文はそのまま実行できますが、

一つ目の引数('ココニ変換・・・')の箇所に変換したい文字列を入れ、実行してみて下さい。

-- 構文(5行で一つのSQLです)
select translate(
	'ここに変換する文字を入力します',
	'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゕゖ',
	'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ'
);
--【結果】ココニ変換スル文字ヲ入力シマス

 

カタカナをひらがなに変換、置換する

カタカナをひらがなに置換します。

(自作関数が必要なく)SELECT文だけ必要な人この記事の下部へ

 

あわせて読みたい

ひらがな→カタカナの置換はこちらです

https://postgresweb.com/post-180

 

引数

引数1(character varying):置換する文字列

 

返り値

置換した文字列

 

コード

CREATE OR REPLACE FUNCTION convert_katakana_to_hiragana(character varying)
  RETURNS character varying AS
$BODY$
declare

	c_katakana	alias for $1;      --引数1:置換する文字列
	c_hiragana	character varying;

begin

	c_hiragana = translate(
	c_katakana,
	'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ',
	'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゕゖ'
	);

	return c_hiragana;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例

select * From convert_katakana_to_hiragana('アメリカ');
--【結果】あめりか

 

(自作関数が必要ない人向け)SELECT文のみの紹介

SELECT文だけ必要な人向けです。次のSELECT文はそのまま実行できますが、

一つ目の引数('ココニ変換・・・')の箇所に変換したい文字列を入れ、実行してみて下さい。

-- 構文(5行で一つのSQLです)
select translate(
	'ココニ変換スル文字ヲ入力シマス',
	'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ',
	'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゕゖ'
);
--【結果】ここに変換する文字を入力します

 

 

文字列が空であるかのチェックする

文字列が空であるかのチェックする関数です (nullも空と判定します)。

関数の必要はなく、case文で処理する方法こちら

 

引数

引数1(character varying): 対象の文字列

 

返り値

true:空 false:空でない

 

コード

CREATE OR REPLACE FUNCTION isempty(
	c_target character varying)
    RETURNS boolean
    LANGUAGE 'plpgsql' COST 100 VOLATILE 
    
AS $BODY$
declare
	b_flg		boolean:=false; 
BEGIN

	--初期値セット
	b_flg = false;

	--""のチェック
	if trim(c_target) = '' then
		b_flg = true;
	end if;

	--nullチェック
	if c_target is null then
		b_flg = true;
	end if;

	return b_flg;

END;
$BODY$;

※ PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

 

実行例

select isempty(null);    -- true(判定:空)
select isempty('');      -- true(判定:空)
select isempty('abc');   -- false(判定:空でない)

 

 

case文

関数の必要はなく、case文で処理するならこの例を参考にして下さい。

そのまま実行できるので、'ここにチェックする文字を入れる'の箇所を変えて実行してみて下さい。

-- nullの時:'a' , 空文字の時:'b' , それ以外は'c'とする
select case 
when 'ここにチェックする文字を入れる' is null then 'a' 
when 'ここにチェックする文字を入れる' = '' then 'b' 
else 'c' end;

 

あわせて読みたい

こちらも参考に

https://postgresweb.com/post-1593

https://postgresweb.com/post-4704

 

曜日を取得する自作関数

引数の日付から曜日を取得する自作関数です。

 

使用する構文

曜日を取得するには「date_part」を使用します。

返り値は数値となるため、読みかえが必要です。(0=日 , 1=月 , 2=火 , 3=水 , 4=木 , 5=金 , 6=土

--曜日を取得する ※ 'dow' = Day of Weekの略
date_part('dow', timestamp)
date_part('dow', date)

--使用例
select date_part('dow', now());                  -- 3 (水曜日)
select date_part('dow', timestamp '2021/1/1');   -- 5(金曜日)
select date_part('dow', date '2021/2/1');        -- 1(月曜日)

 

引数

引数1(timestamp without time zone): 曜日を取得する日(タイムスタンプ)

 

返り値

日 , 月 , 火 , 水 , 木 , 金 , 土 の文字列

 

コード

CREATE OR REPLACE FUNCTION get_dayofweek(t_day timestamp without time zone)
  RETURNS character varying AS
$BODY$
declare
	c_dayofweek	character varying;
begin

	select	case 
		when date_part('dow', t_day) = 0 then '日'	
		when date_part('dow', t_day) = 1 then '月'
		when date_part('dow', t_day) = 2 then '火'	
		when date_part('dow', t_day) = 3 then '水'
		when date_part('dow', t_day) = 4 then '木'	
		when date_part('dow', t_day) = 5 then '金'
		when date_part('dow', t_day) = 6 then '土'	
	else	
		null
	end	into c_dayofweek;

	return c_dayofweek;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

※ PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例(呼び出し例)

select get_dayofweek(timestamp '2021/01/01');  -- 金
select get_dayofweek(date '2021/1/10');        -- 日

 

関連記事

現在日時、システム日時の取得

日付の加算、週の加算、月の加算

日付であるかのチェック(IsDate)【自作関数】

2つの日付の差を計算する【自作関数】

西暦から和暦へ変換する【自作関数】

次の月曜日、火曜日、○曜日を求める(next_day関数)【自作関数】

月末日を取得する(LAST_DAY)【自作関数】

 

日付であるかのチェック(IsDate)

特定の文字列が日付であるかチェックします(=日付に変換できるかをチェックします)

 

引数

引数1(character varying): チェックする文字列

 

返り値

true:日付である false:日付でない

 

コード

CREATE OR REPLACE FUNCTION isdate(c_day character varying)
  RETURNS boolean AS
$BODY$
declare
	d_temp 		date;  --一時変数
BEGIN

	select cast(c_day as date) into d_temp;

    --castできる時はtrueでリターン
	return TRUE;
	
	EXCEPTION
	WHEN OTHERS THEN
	--castできずエラーになる時はfalseでリターン
	return FALSE;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例

select isdate('20190101');     -- true
select isdate('2019/01/01');   -- true
select isdate('abc');          -- false
select isdate('20190132');     -- false(存在しない日付はfalseとなる)

 

関連記事

文字を日付に変換する、書式を設定する(cast、to_char、to_date)

timestampのwithout time zoneとwith time zoneの違い

日時、時刻の書式設定をする(yyyymmdd形式)

現在日時、システム日時の取得

日付の加算、週の加算、月の加算

日付であるかのチェック(IsDate)【自作関数】

日付を加算する(timestamp型)【自作関数】

日付を加算する(Date型)【自作関数】

曜日を取得する【自作関数】

2つの日付の差を計算する【自作関数】

西暦から和暦へ変換する【自作関数】

年月日の文字列から日付を作成する【自作関数】

次の月曜日、火曜日、○曜日を求める(next_day関数)【自作関数】

月末日を取得する(LAST_DAY)【自作関数】