四則演算
-
加算:フィールドA + フィールドB
-
減算:フィールドA - フィールドB
-
乗算:フィールドA * フィールドB
-
除算:フィールドA / フィールドB
-
MOD関数を使用することで、除算で余りが発生したかどうかを知ることが可能です。
(例)フィールドAをフィールドBで割った際に余りが発生したかどうかを表示する式CASE WHEN MOD(フィールドA, フィールドB) = 0 THEN '余りなし' ELSE '余りあり' END
-
端数処理
-
四捨五入:ROUND(フィールドA, 小数桁数)
(例)フィールドAの結果を小数2桁で四捨五入したい場合ROUND(フィールドA, 2)
(実際の例)「2513.563」を数値として、小数点第三位を四捨五入したい場合
⇒式:ROUND(2513.563, 2)
⇒結果:2513.56 -
切り捨て:TRUNC(フィールドA, 小数桁数)
(実際の例)「12500」を数値として、千円単位で丸めたい場合
⇒式:TRUNC(12500, -3)
⇒結果:12000 -
切り上げ:CEIL(フィールドA)
型変換
-
文字列に変換:CHAR(フィールドA)
-
ゼロ埋めの文字列に変換:DIGITS(フィールドA)
※元フィールドの桁数分、前0埋めされた結果を返します -
数値に変換:INT(フィールドA)
-
実数に変換:DECIMAL(フィールドA, 合計桁数, 小数桁数)
※パラメータの2つ目に整数桁数、パラメータ3つ目に小数桁数を指定します
フィールドを小数に型変換することで小数点以下ありの結果が得られるようになります
(例)8桁のフィールドAを小数2桁の数値型に変換し、小数2桁目で四捨五入ROUND((DECIMAL(フィールドA, 8, 2),2)
文字列の結合
-
文字列フィールド同士の結合:CONCAT(フィールドA, フィールドB)
-
3つの文字列フィールドの結合:CONCAT(CONCAT(フィールドA, フィールドB), フィールドC)
(例)フィールドAとフィールドBの間にハイフンを入れて結合したい場合CONCAT(CONCAT(フィールドA, '-'), フィールドB)
-
数値フィールドと文字列フィールドの結合:CONCAT(数値フィールド, 文字列フィールド)
※タイプが数値フィールドの場合、暗黙的にVARCHAR(可変長文字列)に変換されます
文字列の置換
-
文字列フィールドを置換:REPLACE(フィールドA, 置換したい文字列, 置換する文字列)
(例)「2021-01-01」を「2021/01/01」に置換REPLACE('2021-01-01', '-', '/')
(例)フィールドAの項目内にある全角の空白を全て削除
REPLACE(フィールドA, ' ', '')
※フィールドA内の全角の空白は全て消えてしまうのでご注意ください。
(例)フィールドAの項目内にある全角の空白が2回以上続いた場合に空白削除REGEXP_REPLACE(フィールドA, ' {2,}', '')
※フィールドの最後尾に登録されている半角の空白は全てシステム側の処理で自動的にTRIM(削除)されます
文字列の部分抽出
SUBSTR関数を使用し、文字の部分抽出を行います。
■構文:SUBSTR(パラメータA, パラメータB, パラメータC)
■パラメータ
パラメータA:文字列フィールド、もしくは指定文字列
パラメータB:抽出開始位置
パラメータC:抽出文字数
(例1)文字列フィールドAの2桁目を1文字抽出
SUBSTR(フィールドA, 2, 1)
(例2)指定文字列の1桁目を1文字抽出
SUBSTR('ABCDEFG',1,1)
(例3)数値フィールドAを文字列に変換して1桁目から6文字抽出し、6桁の小数点以下0桁の数値タイプで抽出
DECIMAL(SUBSTR(フィールドA, 1, 6),6 ,0)
条件によって出力する値を変換
CASE関数を使用し、条件による出力値を変換します。
■構文:CASE WHEN 条件式 THEN 条件にマッチした時の値 ELSE 条件にマッチしなかった時の値 END
(例1)フィールドAの値が'1'の場合は'○'、それ以外の場合は'×'を出力
CASE WHEN フィールドA = '1' THEN '○' ELSE '×' END
(例2)フィールドAの値が'1'の場合は'○'、フィールドAの値が'2'の場合は'△'、それ以外の場合は'×'を出力
CASE WHEN フィールドA = '1' THEN '○' WHEN フィールドA = '2' THEN '△' ELSE '×' END
(例3)フィールドAの値が'1'か'2'の場合は'○'、それ以外の場合は'×'を出力
CASE WHEN フィールドA IN ('1','2') THEN '○' ELSE '×' END
(例4)フィールドAの値が'M'の場合はフィールドBに負号を付け、それ以外の場合はフィールドBの値をそのまま出力
CASE WHEN フィールドA = 'M' THEN フィールドB * -1 ELSE フィールドB END
(例5)フィールドA / フィールドB のゼロ除算回避
CASE WHEN フィールドB = 0 THEN フィールドA ELSE フィールドA / フィールドB END
※フィールドBの値が'0'の場合は「フィールドA」の値をそのまま出力、それ以外の場合は「フィールドA / フィールドB」の結果を出力
システム日付の取得
NOW()関数を使用し、本日日付を取得します。
■構文:NOW()
(例1)システム日付をYYYYMMDDで取得
REPLACE(SUBSTR(CAST(NOW() AS CHAR(26)), 1, 10), '-', '')
※NOWはタイムスタンプ型(YYYY-MM-DD HH:MM:SS)であるため、CAST関数を使用してCHAR型に変換後、年月日部分の10桁(YYYY-MM-DD)をSUBSTR関数を利用して抽出し、REPLACE関数で'-'を''に置換します
(例2)システム日付の月初をYYYYMMDDで取得
REPLACE(SUBSTR(CAST(NOW()AS CHAR(26)), 1, 8), '-', '') || '01'
※NOWはタイムスタンプ型(YYYY-MM-DD HH:MM:SS)であるため、CAST関数を使用してCHAR型に変換後、年月部分の8桁(YYYY-MM)をSUBSTR関数を利用して抽出し、REPLACE関数で'-'を''に置換、最後に固定で'01'を付与します
月末日の取得
LAST_DAY()関数を使用し、月の末日を取得します。
■構文:LAST_DAY()
(例1)年月(YYYYMM)で登録されているフィールドAの月末日をYYYYMMDDで取得
REPLACE(CHAR(LAST_DAY(DATE(TO_DATE(フィールドA || '/01', 'YYYY/MM/DD')))),'-')
※フィールドAのデータが年月の場合、TO_DATEする前に'/01'で日を付与します
※TO_DATE関数を使用してYYYYMMDDをYYYY/MM/DDのタイムスタンプ型に変換します
※LAST_DAY関数は日付型(YYYY-MM-DD)で返されるため、結果フィールドで使用する場合はCHAR型に変更します
※REPLACE関数を使用して「YYYY-MM-DD」から'-'を取り除きます
(例2)システム日付の月末日をYYYYMMDDで取得
REPLACE(CHAR(LAST_DAY(DATE(CURRENT_DATE))),'-')
※CURRENT_DATE関数を使用してシステム日付を取得し、DATE型に変換します
※LAST_DAY関数は日付型(YYYY-MM-DD)で返されるため、結果フィールドで使用する場合はCHAR型に変更します
※REPLACE関数を使用して「YYYY-MM-DD」から'-'を取り除きます
前月や翌月の日付を取得
ADD_MONTHS()関数を使用し、前月や翌月の日付を取得します。
※うるう年を考慮した結果を返します。日はそのままで単純に月だけ加算減算したい場合は「+ フィールド MONTH」「- フィールド MONTH」関数を利用してください。
■構文:ADD_MONTHS(フィールド, 減算 / 加算年月)
(例)年月(YYYYMM)で登録されているフィールドAの前月をYYYYMMDDで取得
REPLACE(CHAR(ADD_MONTHS(DATE(TO_DATE(フィールドA || '/01', 'YYYY/MM/DD')), -1)), '-')
※フィールドAのデータが年月の場合、TO_DATEする前に'/01'で日を付与します
※TO_DATE関数を使用してYYYYMMDDをYYYY/MM/DDのタイムスタンプ型に変換します
※前月を求めるため、ADD_MONTHS関数の第二引数として'-1'を指定します(翌月の場合は'+1'、前々月(2か月前)の場合は'-2')
※ADD_MONTHSは日付型(YYYY-MM-DD)であるため、結果フィールドで使用する場合はCHAR型に変更します
※REPLACE関数を使用して「YYYY-MM-DD」から'-'を取り除きます
ある日数を足した(引いた)日付の取得
「+ DAY」や「- DAY」、「+ MONTH」や「- MONTH」関数を使用して、ある日数・月数を足した日付やある日数・月数を引いた日付を取得します。
■構文
+ フィールド DAY
- フィールド DAY
+ フィールド MONTH
- フィールド MONTH
(例1)年月日(YYYYMMDD)が登録されているフィールドAからフィールドBの値を足して、YYYYMMDDで取得
REPLACE(CHAR(DATE(TO_DATE(CAST(フィールドA AS CHAR(8)), 'YYYY/MM/DD')) + フィールドB DAY), '-')
※フィールドAのデータが数値型の場合、TO_DATEする前にCAST関数で文字型にします
※フィールドBに登録されている値を足すため、DAYは'+'を指定します(足す場合は'+'、引く場合は'-')
※日付型(YYYY-MM-DD)で計算しているため、結果フィールドで使用する場合はCHAR型に変更します
※REPLACE関数を使用して「YYYY-MM-DD」から'-'を取り除きます
(例2)年月日(YYYYMMDD)が登録されているフィールドAの15か月前をYYYYMMDDで取得
REPLACE(CHAR(DATE(TO_DATE(CAST(フィールドA AS CHAR(8)), 'YYYY/MM/DD')) - 15 MONTH), '-')
※フィールドAのデータが数値型の場合、TO_DATEする前にCAST関数で文字型にします
※15か月前を求めるため、MONTHで'-15'を指定します(足す場合は'+'、引く場合は'-')
※日付型(YYYY-MM-DD)で計算しているため、結果フィールドで使用する場合はCHAR型に変更します
※REPLACE関数を使用して「YYYY-MM-DD」から'-'を取り除きます
月の差分の取得
TIMESTAMPDIFF()関数を使って、月の差分を取得します。
■構文:TIMESTAMPDIFF()
(例)開始年月(フィールドA)と終了年月(フィールドB)の差分を取得
フィールドAの値:202102 ※Oタイプ
フィールドBの値:202212 ※Oタイプ
実行結果:23
TIMESTAMPDIFF(64, CHAR(TO_DATE(フィールドB || '/01','YYYY/MM/DD') - TO_DATE(フィールドA || '/01', 'YYYY/MM/DD'))) + 1
※フィールドAとフィールドBのデータが年月の場合、TO_DATEする前に'/01'で日を付加します※TO_DATE関数で年月をタイムスタンプ型に変換します
※フィールドBからフィールドAを引き算して、CHAR型に変換します
※TIMESTAMPDIFF関数で第一パラメータに'64'を指定します(「64」は「月」という意味です)
※もし、フィールドのデータがOタイプでない場合(SタイプやAタイプの場合)は、CASTをする必要があります「CAST(フィールド AS CHAR(8)」
★TIMESTAMPDIFFについての参考URL
https://www.ibm.com/docs/ja/db2-for-zos/11?topic=functions-timestampdiff
日数の差分の取得
DAYS()関数を使用して、日数の差分を取得します。
■構文:DAYS()
(例)開始年月日(フィールドA)と終了年月日(フィールドB)の差分を取得
フィールドAの値:20220212 ※Sタイプ
フィールドBの値:20220415 ※Aタイプ
実行結果:62
DAYS(TO_DATE(CAST(フィールドB AS CHAR(8)), 'YYYY/MM/DD')) - DAYS(TO_DATE(CAST(フィールドA AS CHAR(8)), 'YYYY/MM/DD'))
※フィールドAとフィールドBのデータがSタイプ・Aタイプであるため、CASTします
※TO_DATE関数で年月をタイムスタンプ型に変換します
※DAYS関数でフィールドBからフィールドAを引き算して差分を取得します
曜日を1~7の値で取得
DAYOFWEEK()関数を使って、曜日を示す1から7の範囲の整数を取得します。
■構文:DAYOFWEEK()
(例)フィールドAの値:22/11/06 ※Aタイプ
実行結果:1
DAYOFWEEK(DATE(TO_DATE('20' || フィールドA, 'YYYY/MM/DD')))
※フィールドAの年がYYであるため、頭に'20'を固定で付与し、TO_DATE関数とDATE関数で年月日の型を変換します。
※1が日曜日で、7が土曜日となります
※DAYOFWEEK_ISO()を使用すると1が月曜日で、7が日曜日となります
英字大文字を英字小文字に変換
LOWER()関数を使用して、大文字を小文字に変換します。
■構文:LOWER()
(例)大文字で登録されているフィールドAのデータを小文字に変換
LOWER(フィールドA)
(実際の画面)結果フィールドでの定義方法と出力結果
出力結果に通し番号(連番)をつける
ROWNUMBER()関数とOVER()関数を使用して、クエリーの結果に行番号を付与します。
■構文:ROWNUMBER() OVER()
【その他】
PHPQUERYの仕様としては、DB2 for i で記載可能なSQLは全て使えるようになっております。上記以外の式をご利用いただく場合はDB2 for i の関数仕様書をご覧ください。
【DB2 for i SQL解説書(pdf)】
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_73/db2/rbafzpdf.pdf
【DB2 for i SQL解説書(IBM Knowledge Center)】
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_73/db2/rbafzch2func.htm
コメント
0件のコメント
サインインしてコメントを残してください。