配列の要素数を取得する

配列の要素数を取得するには「array_length」を使います。

-- 配列の要素数を取得する
-- ※ カンマのあとの「1」は1次元の配列であることを表しています
array_length( 配列や配列の変数名 , 1 )

 

 

使用例

-- 1次元配列の要素数を取得する
select * from array_length(array[1,2,3,4,5],1);    --【結果】:5
select * from array_length(array['A','B','C'],1);  --【結果】:3

 

 

 

2次元配列の要素数

2次元配列の要素数を取得するにもarray_length関数を使います。

1次元の要素数を取得するにはarray_length( 配列 , 1 )を、

2次元の要素数を取得するにはarray_length( 配列 , 2 )を指定します。

-- 2次元配列の1次元の要素数を取得する
select * from array_length(array[[1,2],[3,4],[5,6]],1);  --【結果】:3

-- 2次元配列の2次元の要素数を取得する
select * from array_length(array[[1,2],[3,4],[5,6]],2);  --【結果】:2

 

 

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

文字列の先頭から指定した文字数を削除する関数です。

-- 例:'abcdefghijk'の先頭5文字を削除する
select * from char_remove('abcdefghijk',5);  -- fghijk

 

引数

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

引数2(integer):削除する文字数

 

返り値

削除した後の文字列

 

コード

CREATE OR REPLACE FUNCTION char_remove(character varying,integer)
  RETURNS character varying AS
$BODY$
declare

	a_char  	alias for $1;	--引数1:削除する対象の文字列
	i_index  	alias for $2;	--引数2:削除する文字列

begin

	return substring(a_char , i_index + 1, length(a_char) - i_index + 1);
	
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION char_remove(character varying,integer)
  OWNER TO postgres;

※PostgreSQL12で動作確認済み 自作関数の実行方法はこちら

 

実行例

select * from char_remove('abcde',2); --'abcde'の先頭2文字を削除する
--'cde'

 

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

2つの文字列を比較して一致するかチェックする

文字列をバイト数で計算する

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

カンマ区切り文字列の指定カンマ箇所を取得する

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

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

配列に特定の文字列が含まれるかをチェックする

配列に特定の文字列が含まれるかをチェックします。

 

引数

引数1(character varying[]):チェックする配列

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

 

返り値

True:含む、False:含まない

 

コード

CREATE OR REPLACE FUNCTION check_array_exists(
    character varying[],
    character varying)
  RETURNS boolean AS
$BODY$
declare
 
	a_array	        alias for $1; 	--引数1:チェックする配列
	c_check_char	alias for $2; 	--引数2:探す文字列
	
begin
  
	for temp_count in 1..array_length(a_array,1)
	loop
		if a_array[temp_count] = c_check_char then
			return true;
		end if;
 
	end loop;
 
	return false;
 
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION check_array_exists(character varying[], character varying)
  OWNER TO postgres;

 

実行例

select * from check_array_exists(array['a','b','c'],'b');
--True

 

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

2つの配列を結合する

配列が全て空かチェックする

 

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

2つの文字列を比較して一致するかチェックする関数です。

※ 小文字大文字、半角全角が異なっても一致と判定するので、判定は適宜変更してください。

 

"postgresql"と"PostgreSQL"       ⇒  true(一致)

"postgresql"と"postgresql" ⇒  true(一致)

"postgresql"と"postgreSQL" ⇒  true(一致)

"postgresql"と"oracle"        ⇒  false(不一致)

 

引数

数1(character varying):比較する文字列1

引数2(character varying):↑と比較する文字列2

 

返り値

true:一致する、false:一致しない

 

コード

CREATE OR REPLACE FUNCTION check_same_character(
	c_target character varying,
	c_comparison character varying)
    RETURNS boolean
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    
AS $BODY$
declare 
BEGIN
 
	--1.trim
	c_target = trim(c_target);
	c_comparison = trim(c_comparison);

	--2.大文字へ変換、3.半角を全角に変換する
	c_target = translate(upper(c_target), '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ', '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ');
	c_comparison = translate(upper(c_comparison), '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ', '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ');
  
	--4.ロケールが「C」の時、全角小文字がupperされないためここで変換
	c_target = translate(c_target, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ');
	c_comparison = translate(c_comparison, 'abcdefghijklmnopqrstuvwxyz ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ');
    
	--一致かの判定
	if c_target = c_comparison then
        --一致する
		return true;
	else
        --一致しない
		return false;
	end if;
  
END;
$BODY$;

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

 

実行例

-- 「小文字」と「小文字大文字混合」の比較
select check_same_character('postgresql','PostgreSQL');         --【結果】:true

-- 「小文字(半角)」と「小文字(全角)」の比較
select check_same_character('postgresql','postgresql'); --【結果】:true

-- 「小文字(半角)」と「小文字大文字混合(全角)」の比較
select check_same_character('postgresql','postgreSQL'); --【結果】:true

-- 全く異なる文字列の比較
select check_same_character('postgresql','oracle');             --【結果】:false

 

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

「基本構文・こんな時どう書くんだっけ?」のまとめ

2つの配列を結合する

2つの配列を結合する関数です。

(片方の配列の後ろにもう一つの配列を挿入し、一つの配列にする)

 

引数

引数1(character varying[]):結合する配列1(こちらの配列の後に↓の配列を挿入します)

引数2(character varying[]):結合する配列2

 

返り値

結合後の配列

 

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

CREATE OR REPLACE FUNCTION array_merge(
    character varying[],
    character varying[])
  RETURNS character varying[] AS
$BODY$
declare
 
	a_array1	alias for $1; 	--引数1:結合する配列1(こちらの配列の後に↓の配列を挿入します)
	a_array2	alias for $2; 	--引数2:結合する配列2
 
	a_merge_array	character varying[];
	i_maxcount	integer;
	
	c_temp		character varying;
	
BEGIN

	i_maxcount = array_length(a_merge_array,1) + array_length(a_array2,1) ;
 
	a_merge_array = a_array1;
 
	for cnt in 1..array_length(a_array2,1)
	loop
		a_merge_array[array_length(a_array1,1) + cnt] = a_array2[cnt];
	end loop;
 
	return a_merge_array;
 
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION array_merge(character varying[], character varying[])
  OWNER TO postgres;

※PostgreSQL12で動作確認済み

 

実行例

select * from array_merge(array['1','2','3'],array['a','b','c','d','e']);
--【結果】"1,2,3,a,b,c,d,e"

 

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

配列に特定の文字列が含まれるかをチェックする

配列が全て空かチェックする

 

西暦から和暦へ変換する関数

西暦から和暦へ変換する関数です。

 

引数

引数1(date):変換する日付

 

返り値

和暦(和暦の頭文字+年月日)

例:1987/9/1 ⇒ S620901

 

コード

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

begin

	--$1:引数(変換する日付)
	if $1 > '20190430' then
		--令和
		return 'R' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 20180000;
	elseif $1 > '19890107' then
		--平成
		return 'H' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 19880000;
	elseif $1 > '19261224' then
		--昭和
		return 'S' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 19250000;
	elseif $1 > '19120729' then
		--大正
		return 'T' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 19110000;
	elseif $1 > '18680124' then
		--明治
		return 'M' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 18670000;
	end if;

	return null;
    
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

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

 

実行例

select * From convert_seireki_to_wareki('1950/1/1');  --"S250101"

select * From convert_seireki_to_wareki('2000/1/1');  --"H120101"

 

※ 2020/11/24 追記

H12/01/01のようなスラッシュを入れた形式の関数を用意しました。

コード(結果にスラッシュを入れた形式)

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

	tmp character varying;
	jpn_history character varying; -- 和歴

begin

	--$1:引数(変換する日付)
	if $1 > '20190430' then
		--令和
		tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 20180000;
		jpn_history = 'R';
		
	elseif $1 > '19890107' then
		--平成
		tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 19880000;
		jpn_history = 'H';
		
	elseif $1 > '19261224' then
		--昭和
		tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 19250000;
		jpn_history = 'S';
		
	elseif $1 > '19120729' then
		--大正
		tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 19110000;
		jpn_history = 'T';
		
	elseif $1 > '18680124' then
		--明治
		tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 18670000;
		jpn_history = 'M';
		
	end if;

	--return(スラッシュを入れた形式でリターン)
	if length(tmp) = 6 then
		return jpn_history || substring(tmp,1,2) || '/' || substring(tmp,3,2) || '/' || substring(tmp,5,2);
	elseif length(tmp) = 5 then
		return jpn_history || substring(tmp,1,1) || '/' || substring(tmp,2,2) || '/' || substring(tmp,4,2);
	else
		return null;	
	end if;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

 

実行例

select * From convert_seireki_to_wareki('1950/1/1');  --"S25/01/01"

select * From convert_seireki_to_wareki('2000/1/1');  --"H12/01/01"

select * From convert_seireki_to_wareki('2020/3/1');  --"R2/03/01"

 

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

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

説明

文字列を○文字目から×文字までを取得します(mid関数)。

 

引数

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

引数2(integer):何文字目から切り取るか

引数3(integer):何文字切り取るか

 

返り値

切り取った後の文字列

 

コード

CREATE OR REPLACE FUNCTION public.mid(
	c_target_char character varying,
	i_cut_start integer,
	i_cut_num integer)
    RETURNS character varying
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    
AS $BODY$
declare
BEGIN

	return substring(c_target_char,i_cut_start, i_cut_num); 

END;
$BODY$;

ALTER FUNCTION public.mid(character varying, integer, integer)
    OWNER TO postgres;

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

 

実行例

select * From mid('abcdef',2,3); 
--【結果】: 'bcd'

 

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

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

説明

ある数値に対し税込の計算をして返します。(整数値)

 

引数

引数1(integer):税込前の数値

引数2(integer):10%で計算するか8%で計算するかのフラグ(1:10%で計算、それ以外:8%で計算)

 

返り値

税込後の数値

 

コード

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

	c_target	alias for $1; 	--引数1: 消費税を計算する数値
	i_flg		alias for $2; 	--引数2: 1:10%で計算、それ以外:8%で計算
	
BEGIN

	if i_flg = 1 then
		c_target = cast(round(c_target * 1.1,1) as integer);
	else
		c_target = cast(round(c_target * 1.08,1) as integer);
	end if;
	
	return c_target; 

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

※PostgreSQL12で動作確認済み

 

実行例

select * From calc_tax(100,1);  --※10%で計算
--【結果】110

select * From calc_tax(100,2);  --※8%で計算
--【結果】108

 

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

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

四捨五入(Round)

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

数値をカンマで区切る