2.10.1 四則演算の形式と規則
- 〈この項の構成〉
(1) 四則演算の種類と機能
SQLの値式中に四則演算を使用した検索ができます。四則演算の種類と機能を次の表に示します。
四則演算 |
意味 |
機能 |
|
---|---|---|---|
+ |
(単項演算) |
正符号 |
符号を反転しません。 |
(2項演算) |
加算 |
第1演算項に第2演算項を加えます。 |
|
− |
(単項演算) |
負符号 |
符号を反転します。 |
(2項演算) |
減算 |
第1演算項から第2演算項を減らします。 |
|
* |
(2項演算) |
乗算 |
第1演算項に第2演算項を掛けます。 |
/ |
(2項演算) |
除算 |
第1演算項を第2演算項で割ります。 |
(2) 四則演算結果のデータ型
第1演算項データ型が,SMALLINT,INTEGER,DECIMAL,SMALLFLT,及びFLOATの場合の,四則演算(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項演算)の演算項のデータ型と演算結果のデータ型の関係」によって決定します。
-
整数の文字列表現は,INTEGER型に変換されます。
-
10進数の文字列表現は,DECIMAL型に変換されます。
-
浮動小数点数の文字列表現は,FLOAT型に変換されます。
四則演算は,既に示したデータ型で演算されます。単項演算の場合の演算結果のデータ型は,演算項のデータ型と同じです。四則演算の結果のデータ型が,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) 規則
四則演算を使用する場合の規則については,次に示す規則と,「値式,値指定,及び項目指定」の共通規則を参照してください。
-
四則演算は,数データに対して実行します。文字データを指定した場合,文字データを数データに変換してから四則演算を実行します。
-
次の結果が文字データとなる値式は四則演算に指定できません。
-
USER
-
SQLERRM_OF_LAST_CONDITION
-
-
文字データを含む四則演算を次の場所に指定する場合,文字データとして指定できるのは文字列定数,又は混在文字列定数だけです。
-
選択式
-
集合関数の引数
-
ユーザ定義関数(システム定義スカラ関数を含む)の引数
-
GROUP BY句
-
分割列に対するVALUES句の値式
-
新値相関名で参照するINSERT文のVALUES句,又はUPDATE文のSET句の値式
-
旧値相関名で参照するUPDATE文SET句の値式
-
-
四則演算子(+,−,*,/)の両側に埋込み変数,又は?パラメタだけの値式は指定できません。
-
異なるデータ型の四則演算をネストさせる場合には,途中の演算結果に注意する必要があります。
-
演算項中にウィンドウ関数は指定できません。
-
演算項中に予備列は指定できません。
(4) 留意事項
-
次に示す四則演算の規則は,オーバフローエラー抑止が設定されている場合は,エラーになりません。
-
除算で第2演算項の値に0を指定した場合は,エラーになります。
-
計算途中でオーバフローが発生した場合は,エラーになります。
なお,オーバフローエラー抑止が設定されている場合の演算結果については,「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。
-
-
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
-
四則演算と連結演算の混在する場合,結果のデータ型は演算順序,各演算の結果によって決まります。
(例)
図2‒5 結果のデータ型