2.10 四則演算

<この節の構成>
(1) 四則演算の種類と機能
(2) 四則演算結果のデータ型
(3) 規則
(4) 留意事項

(1) 四則演算の種類と機能

SQLの値式中に四則演算を使用した検索ができます。四則演算の種類と機能を次の表に示します。

表2-13 四則演算の種類と機能

四則演算意味機能
(単項演算)正符号符号を反転しません。
(2項演算)加算第1演算項に第2演算項を加えます。
(単項演算)負符号符号を反転します。
(2項演算)減算第1演算項から第2演算項を減らします。
(2項演算)乗算第1演算項に第2演算項を掛けます。
(2項演算)除算第1演算項を第2演算項で割ります。

(2) 四則演算結果のデータ型

第1演算項データ型が,SMALLINT,INTEGER,DECIMAL,SMALLFLT,及びFLOATの場合の,四則演算(2項演算)の演算項のデータ型と演算結果のデータ型の関係を次の表に示します。

表2-14 四則演算(2項演算)の演算項のデータ型と演算結果のデータ型の関係

第1演算項データ型第2演算項データ型
SMALLINTINTEGERDECIMALSMALLFLTFLOAT
SMALLINTINTEGERINTEGERDECIMALSMALLFLTFLOAT
INTEGERINTEGERINTEGERDECIMALFLOATFLOAT
DECIMALDECIMALDECIMALDECIMALFLOATFLOAT
SMALLFLTSMALLFLTFLOATFLOATSMALLFLTFLOAT
FLOATFLOATFLOATFLOATFLOATFLOAT

第1演算項データ型が,CHAR,VARCHAR,MCHAR,及びMVARCHARの場合,又は第1演算項データ型がSMALLINT,INTEGER,DECIMAL,SMALLFLT,及びFLOATの場合で,第2演算項データ型が,CHAR,VARCHAR,MCHAR,及びMVARCHARのときの,四則演算(2項演算)の演算項のデータ型と演算結果のデータ型の関係について説明します。

文字データはその値の文字列表現によって次の数データ型に変換されます。演算結果のデータ型は変換後の数データ型を用いて,「表2-14 四則演算(2項演算)の演算項のデータ型と演算結果のデータ型の関係」によって決定します。

四則演算は,既に示したデータ型で演算されます。単項演算の場合の演算結果のデータ型は,演算項のデータ型と同じです。四則演算の結果のデータ型が,DECIMALの場合の結果の精度と位取りを次の表に示します。

表2-15 四則演算の結果のデータ型がDECIMALの場合の結果の精度と位取り

四則演算結果のデータ型精度と位取り
加減算の場合乗算の場合除算の場合
DECIMAL(p,s)p=1+max(p1-s1,p2-s2)+s
s=max(s1,s2)
p=p1+p2
s=s1+s2
P=max_prec
s=max(0,max_prec-((p1-s1)+s2))
DECIMAL(p',s')
(p>max_precの場合)
p'=max_prec
s'=max(s1,s2)
該当しません。
注1
第1演算項のデータ型:DECIMAL(p1,s1)
第2演算項のデータ型:DECIMAL(p2,s2)
注2
max_precはDECIMAL型の精度の最大値です。max_precについて,次の表に示します。なお,pd_sql_dec_op_maxprecオペランドについては,マニュアル「HiRDB Version 8 システム定義」を参照してください。

表2-16 DECIMAL型の精度の最大値

システム共通定義pd_sql_dec_op_maxprecオペランド第1演算項の精度p1と第2演算項の精度p2max_precの値
29又は省略p1≦29かつp2≦2929
p1>29又はp2>2938
38任意38
注3
INTEGERは,DECIMAL(10,0)として扱われます。
SMALLINTは,DECIMAL(5,0)として扱われます。

(3) 規則

四則演算を使用する場合の規則については,次に示す規則と,「2.9 値式,値指定,及び項目指定」の共通規則を参照してください。

  1. 四則演算は,数データに対して実行します。文字データを指定した場合,文字データを数データに変換してから四則演算を実行します。
  2. 次の結果が文字データとなる値式は四則演算に指定できません。
    • USER
    • SQLERRM_OF_LAST_CONDITION
  3. 文字データを含む四則演算を次の場所に指定する場合,文字データとして指定できるのは文字列定数,又は混在文字列定数だけです。
    • 選択式
    • 集合関数の引数
    • ユーザ定義関数(システム定義スカラ関数を含む)の引数
    • GROUP BY句
    • 分割列に対するVALUES句の値式
    • 新値相関名で参照するINSERT文のVALUES句,又はUPDATE文のSET句の値式
    • 旧値相関名で参照するUPDATE文SET句の値式
  4. 四則演算子(+,-,*,/)の両側に埋込み変数,又は?パラメタだけの値式は指定できません。
  5. 異なるデータ型の四則演算をネストさせる場合には,途中の演算結果に注意する必要があります。
  6. 演算項中にウィンドウ関数は指定できません。

(4) 留意事項

  1. 次に示す四則演算の規則は,オーバフローエラー抑止が設定されている場合は,エラーになりません。
    • 除算で第2演算項の値に0を指定した場合は,エラーになります。
    • 計算途中でオーバフローが発生した場合は,エラーになります。
    なお,オーバフローエラー抑止が設定されている場合の演算結果については,「2.18 オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。
  2. DECIMALの除算で,被除数の整数部のけた数(p1-s1)と,除数の小数部のけた数(s2)の合計がmax_prec以上の場合((p1-s1)+s2≧max_prec),除算の結果の位取りは0となります。小数点以下のけたを求めたい場合,除算前にスカラ関数DECIMALを使用して,被除数の精度(p1),又は除数の位取り(s2)を小さくしてください。
    (参考)
    表2-15 四則演算の結果のデータ型がDECIMALの場合の結果の精度と位取り」から,次の式が求められます。
    p1=max_prec-s+s1-s2
    s2=max_prec-s+s1-p1
    (例)
    システム共通定義のpd_sql_dec_op_maxprecオペランドが29,又はこのオペランドを省略した場合,表T1の列C1(DECIMAL(12,2))及び列C2(DECIMAL(12,2))のそれぞれの合計値(SUM)の除算を求めると,DEC(29,2)とDEC(29,2)による除算となり,その結果はDEC(29,0)となります。小数点以下2けたまで求めたい場合は,スカラ関数DECIMALを使用して,被除数の精度を小さくします。
    SELECT DEC(SUM(C1),27,2)/SUM(C2) FROM T1
  3. 四則演算と連結演算の混在する場合,結果のデータ型は演算順序,各演算の結果によって決まります。
    (例)

    図2-5 結果のデータ型

    [図データ]