SQL PL 分岐
DB2のSQLプロシージャ言語(SQL PL)での分岐文について説明します。
SQL PLでの分岐は、IF文、CASE文があります。
それぞれ順番に説明します。
IF文
IF文について説明します。
構文は以下の通りです。
2つ目の条件や、条件を満たさない場合の文が不要な場合、ELSEIF、ELSEは省略可能です。
【文法】
IF 条件1 THEN条件1を満たす場合に実行する文。
ELSEIF 条件2 THEN
条件2を満たす場合に実行する文。
ELSE
いずれの条件も満たさない場合実行する文。
END IF;
【例】
-- 曜日のカレンダーの日付の文字色を返す CREATE OR REPLACE FUNCTION SF_GET_DAY_COLOR(IN VC_DAY_OF_WEEK VARCHAR(10)) RETURNS VARCHAR(10) LANGUAGE SQL BEGIN DECLARE VC_RET VARCHAR(10); IF VC_DAY_OF_WEEK = 'Sunday' THEN SET VC_RET = 'Red'; ELSEIF VC_DAY_OF_WEEK = 'Saturday' THEN SET VC_RET = 'Blue'; ELSE SET VC_RET = 'Black'; END IF; RETURN VC_RET; END /
CASE文
CASE文について説明します。
構文は以下の通りです。
条件が複数個ある場合、その分WHENを記述することが可能です。
また、ELSEは省略可能です。
【文法】
CASE WHEN 条件1 THEN条件1を満たす場合に実行する文。
WHEN 条件2 THEN
条件2を満たす場合に実行する文。
WHEN 条件3 THEN
条件3を満たす場合に実行する文。
:
ELSE
いずれの条件も満たさない場合実行する文。
END CASE;
【例】
-- 和暦の文字列を返す関数 CREATE OR REPLACE FUNCTION SF_JPN_CLDR_STR(P_DT_TERGET DATE) RETURNS VARCHAR(30) LANGUAGE SQL BEGIN -- 変数宣言 DECLARE INT_YMD INTEGER; DECLARE INT_YEAR INTEGER; DECLARE INT_JPN_YEAR INTEGER; DECLARE VC_GENGO VARCHAR(20); SET INT_YMD = TO_NUMBER(TO_CHAR(P_DT_TERGET, 'YYYYMMDD')); SET INT_YEAR = TRUNC(INT_YMD / 10000); CASE WHEN INT_YMD > 20190430 THEN SET VC_GENGO = '令和'; SET INT_JPN_YEAR = INT_YEAR - 2018; WHEN INT_YMD > 19890107 THEN SET VC_GENGO = '平成'; SET INT_JPN_YEAR = INT_YEAR - 1988; WHEN INT_YMD > 19261224 THEN SET VC_GENGO = '昭和'; SET INT_JPN_YEAR = INT_YEAR - 1925; WHEN INT_YMD > 19120729 THEN SET VC_GENGO = '大正'; SET INT_JPN_YEAR = INT_YEAR - 1911; WHEN INT_YMD > 18680124 THEN SET VC_GENGO = '明治'; SET INT_JPN_YEAR = INT_YEAR - 1911; ELSE -- 不明の場合は元号の部分に西暦の千百の位を設定 SET VC_GENGO = TO_CHAR(TRUNC(INT_YEAR / 100)); SET INT_JPN_YEAR = MOD(INT_YEAR, 100); END CASE; RETURN VC_GENGO || RIGHT(TO_CHAR(INT_JPN_YEAR, '00'), 2) || '年' || TO_CHAR(P_DT_TERGET, 'MM') || '月' || TO_CHAR(P_DT_TERGET, 'DD') || '日'; END /