説明

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

 

 

引数

引数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)【自作関数】

 

単語の先頭文字を大文字に変換する関数

単語の先頭文字を大文字に変換します。

 

引数

引数1(character varying): 変換する対象の文字列

 

返り値

変換後の文字列

 

コード

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

	c_target_char	alias for $1;

BEGIN

	return initcap(c_target_char); 

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

 

実行例

select * From char_initcap('abcdef');
--【結果】Abcdef

 

関連記事

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

文字の切り取り(Left、Right、Substring)

文字列中に指定した文字が含まれるかのチェック【自作関数】

2つの文字列を比較して一致するかチェックする【自作関数】

文字を左のX文字目から○文字切り取る(Mid関数)【自作関数】

検索文字を後ろから検索する(LastIndexOf)【自作関数】

文字列から指定した文字数を削除する【自作関数】

文字列から検索文字の位置を取得する(IndexOf)【自作関数】

文字列が空であるかのチェック【自作関数】

文字列のバイト数を取得する【自作関数】

ひらがなをカタカナに置換する【自作関数】

カタカナをひらがなに置換する【自作関数】

全角から半角へ変換する【自作関数】

半角から全角へ変換する【自作関数】

 

文字列中に指定した文字が含まれるかのチェック

文字列に、特定の文字列が含まれるかチェックする関数です。

 

引数

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

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

 

返り値

true:含む、false:含まれない

 

コード

CREATE OR REPLACE FUNCTION check_char_exists(
    c_target_char character varying,
    c_replace_char character varying)
  RETURNS boolean AS
$BODY$
declare
BEGIN

	--対象の文字列でreplaceして、元の文字列と異なったら含まれると判断する
	if c_target_char = replace(c_target_char,c_replace_char,'') then
		return false;
	else
		return true;
	end if;
	
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

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

 

実行例

--'abcdef'に'bc'が存在するか
select * From check_char_exists('abcdef','bc');   -- true

--'abcdef'に'xyz'が存在するか
select * From check_char_exists('abcdef','xyz');  -- false

 

関連記事

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

文字の切り取り(Left、Right、Substring)

文字列中に指定した文字が含まれるかのチェック【自作関数】

2つの文字列を比較して一致するかチェックする【自作関数】

文字を左のX文字目から○文字切り取る(Mid関数)【自作関数】

検索文字を後ろから検索する(LastIndexOf)【自作関数】

文字列から指定した文字数を削除する【自作関数】

文字列から検索文字の位置を取得する(IndexOf)【自作関数】

文字列が空であるかのチェック【自作関数】

文字列のバイト数を取得する【自作関数】

ひらがなをカタカナに置換する【自作関数】

カタカナをひらがなに置換する【自作関数】

全角から半角へ変換する【自作関数】

半角から全角へ変換する【自作関数】

 

概要

対象の文字列が数値であるかのチェックをする関数です。

 

引数

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

 

返り値

true:数値 false:数値でない

 

コード

CREATE OR REPLACE FUNCTION isnumeric(c_num character varying)
  RETURNS boolean AS
$BODY$
declare
 
	n_result 		numeric;  -- 一時変数
	
BEGIN

    --数値へcastする
	select cast(c_num as numeric) into n_result;

	--castできる時はtrueでリターン
	return TRUE;
	
    --castできずエラーになる時はここのEXCEPTIONに入る
	EXCEPTION
	WHEN OTHERS THEN
	--エラー時はfalseでリターン
	return FALSE;
 
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

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

 

実行例(呼び出し例)

select * from isnumeric('123456');   -- true :数値
select * from isnumeric('abcdef');   -- False:数値でない

 

関連記事

四捨五入・切り上げ・切り捨て(Round)

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

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

数値を文字に変換する(to_char)

概要

四捨五入、切り上げ、切り捨て用の自作関数です。

「第〇位」を「四捨五入、切り上げ、切り捨て」か、分けることができるようになっています。

 

 

この自作関数で使っている構文

この自作関数では、次の関数を使用しています。

-- 1.四捨五入
round(数値 , 小数点以下をこの桁数にする)  -- 四捨五入
-- 例
select * From round(123.45678,3);      -- 123.457(小数第3位四捨五入)

-- 2.切り捨て
trunc(数値 , 小数点以下をこの桁数にする)  -- 切り捨て
-- 例
select * From trunc(123.45678,3);      -- 123.456(小数第3位切り捨て)

 

 

引数

引数1(numeric): 四捨五入する対象の数値

引数2(integer) : 計算するフラグ (1:四捨五入、2:切り上げ、3:切り捨て)

引数3(integer) : 小数点何桁まで表示するか(2を指定:小数2桁まで表示する)

 

 

返り値

計算後の値

 

 

コード

CREATE OR REPLACE FUNCTION round(
    numeric,
    integer,
    integer)
  RETURNS numeric AS
$BODY$
declare

	n_target        alias for $1; 	--引数1:四捨五入する対象の数値
	i_flg           alias for $2; 	--引数2:計算するフラグ (1:四捨五入、2:切り上げ、3:切り捨て)
	i_digits        alias for $3; 	--引数3:小数点何桁まで表示するか(2を指定:小数2桁まで表示する)
	c_add           character varying;

begin

	if i_flg = 1 then
		--四捨五入
		return round(n_target,i_digits);
	
	elseif i_flg = 2 then
		--切り上げ
		c_add ='0.';
		FOR i IN 1..i_digits LOOP
		    c_add = c_add || '0';
		END LOOP;
		c_add = c_add || '9';

		return trunc(n_target + cast(c_add as numeric),i_digits);
	
	elseif i_flg = 3 then
		--切り捨て
		return trunc(n_target,i_digits);
	end if;

	return null;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

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

 

 

実行例(呼び出し例)

四捨五入

--小数第3位四捨五入(小数2桁まで表示する)
select * From round(1.2345678,1,2);  --  '1.23'

 

切り上げ

--小数第4位切り上げ(小数3桁まで表示する)
select * From round(1.2345678,2,3);  --'1.235'
 

切り捨て

--小数第4位切り捨て(有効桁数3桁)
select * From round(1.2345678,3,3);  --'1.234'

 

 

関連記事

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

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

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