Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


2.10.1 四則演算の形式と規則

〈この項の構成〉

(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演算項データ型

SMALLINT

INTEGER

DECIMAL

SMALLFLT

FLOAT

SMALLINT

INTEGER

INTEGER

DECIMAL

SMALLFLT

FLOAT

INTEGER

INTEGER

INTEGER

DECIMAL

FLOAT

FLOAT

DECIMAL

DECIMAL

DECIMAL

DECIMAL

FLOAT

FLOAT

SMALLFLT

SMALLFLT

FLOAT

FLOAT

SMALLFLT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

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

文字データはその値の文字列表現によって次の数データ型に変換されます。演算結果のデータ型は変換後の数データ型を用いて,表「四則演算(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 システム定義」を参照してください。

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

システム共通定義pd_sql_dec_op_maxprecオペランドの値

第1演算項の精度p1と第2演算項の精度p2

max_precの値

29

p1≦29かつp2≦29

29

p1>29又はp2>29

38

38

任意

38

注3

INTEGERは,DECIMAL(10,0)として扱われます。

SMALLINTは,DECIMAL(5,0)として扱われます。

(3) 規則

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

  1. 四則演算は,数データに対して実行します。文字データを指定した場合,文字データを数データに変換してから四則演算を実行します。

  2. 次の結果が文字データとなる値式は四則演算に指定できません。

    • USER

    • SQLERRM_OF_LAST_CONDITION

  3. 文字データを含む四則演算を次の場所に指定する場合,文字データとして指定できるのは文字列定数,又は混在文字列定数だけです。

    • 選択式

    • 集合関数の引数

    • ユーザ定義関数(システム定義スカラ関数を含む)の引数

    • GROUP BY句

    • 分割列に対するVALUES句の値式

    • 新値相関名で参照するINSERT文のVALUES句,又はUPDATE文のSET句の値式

    • 旧値相関名で参照するUPDATE文SET句の値式

  4. 四則演算子(+,−,*,/)の両側に埋込み変数,又は?パラメタだけの値式は指定できません。

  5. 異なるデータ型の四則演算をネストさせる場合には,途中の演算結果に注意する必要があります。

  6. 演算項中にウィンドウ関数は指定できません。

  7. 演算項中に予備列は指定できません。

(4) 留意事項

  1. 次に示す四則演算の規則は,オーバフローエラー抑止が設定されている場合は,エラーになりません。

    • 除算で第2演算項の値に0を指定した場合は,エラーになります。

    • 計算途中でオーバフローが発生した場合は,エラーになります。

    なお,オーバフローエラー抑止が設定されている場合の演算結果については,「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

  2. DECIMALの除算で,被除数の整数部のけた数(p1−s1)と,除数の小数部のけた数(s2)の合計がmax_prec以上の場合((p1−s1)+s2≧max_prec),除算の結果の位取りは0となります。小数点以下のけたを求めたい場合,除算前にスカラ関数DECIMALを使用して,被除数の精度(p1),又は除数の位取り(s2)を小さくしてください。

    (参考)

    表「四則演算の結果のデータ型が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 結果のデータ型

    [図データ]