算術演算での数値型
単項算術演算のデータ型は、TINYINTデータ型に適用される否定演算子を除いて、引数のデータ型と同じです。TINYINTは符号なしのため、TINYINTを否定するデータ型はSMALLINTになります。
2項数値の算術演算でのデータ型は、次のように決まります。
- 両方のオペランドが同じデータ型であれば、結果もそれらと同じデータ型になります。たとえば両方のオペランドがDECIMALの場合、結果はDECIMALになります。結果の精度とスケールは、次のように決まります。
- 結果のスケールには、結果の保持に必要な最小限のスケールが設定されます。加算と減算では、結果のスケールは2つのオペランドのうち大きい方のスケールになります。乗算では、結果のスケールは2つのオペランドのスケールの合計になります。スケールを表示できない場合、エラーになります。たとえば、c1のスケールが20を超える場合、式c1×c1を含む文は、結果のデータ型がスケールの最大値40を超えてしまうため表示できません。
- 結果の精度には、演算結果の保持に必要な最小限の精度が設定されます。加算と減算では、結果のスケールに各オペランドの最大精度からスケールを減算した値に1を加算した値が設定されます。乗算では、精度は2つのオペランドの精度の合計になります。値が精度の最大値40を超える場合、精度には40が設定されます。この場合、計算された値は結果のデータ型に対してオーバーフローします。このようなエラーは実行時に検出され、それに応じてエラーが返されます。たとえば、列c1のデータ型がDECIMAL(35,17)の場合、c1×c1の結果は(40,34)になります。c1の値が1234の場合、c1×c1は実行時にオーバーフローのエラーになります。
- 一方のオペランドが正確な値で他方が近似値の場合、結果のデータ型は近似値のオペランドと同様になります。処理を実行する前に、正確な値は強制的に近似値に変換されます。
- 両方のオペランドが近似値で、両方のオペランドにREALとDOUBLEのデータ型が設定されている場合、結果はREALになります。
- 両方のオペランドが整数型(BIGINTではなくTINYINT、SMALLINT、INTEGER)の場合、結果のデータ型は2つのオペランドのデータ型より大きくなります。
- 両方のオペランドが整数型で、少なくとも一方のオペランドがBIGINTの場合、結果のデータ型はBIGINTになります。
- 一方のオペランドが整数型で他方がDECIMALの場合、そのDECIMAL型のスケールが0で精度が整数型の精度より小さい場合を除いて、結果のデータ型はDECIMALになります。この場合、結果のデータ型は整数になります。
- DECIMALを除算した場合、結果は精度40で分子と同じスケールを持つDECIMALになります。
- 算術演算にREALデータ型とDOUBLEデータ型を使用する場合は、注意が必要です。特に、REAL(単精度浮動小数点)型を使用する式は、DOUBLE(倍精度浮動小数点数)型に変換される可能性があります。この変換では、REALデータ型の精度の制限と近似値表現が示されます。
科学表記法で表現される浮動小数点定数のデータ型はDOUBLEです。固定小数点の表記法で表現される定数のデータ型はDECIMALです。たとえば値1は、科学表記法では1.0E+00、DECIMALの固定小数点の表記法では1.0と表現できます。
DECIMALおよびREALデータ型を含む式では、DECIMALはREALに変換されます。REALおよびDOUBLEデータ型を含む式では、REALはDOUBLEに変換されます。
次に、データ型の変換によって発生する可能性がある問題の例を示します。
CREATE TABLE T (C REAL);
INSERT INTO T VALUES (0.1);
SELECT C * 1.0 FROM T /* REAL * DECIMAL */
< .1000000 >
SELECT C * 1.0E+00 FROM T /* REAL * DOUBLE */
< .100000001490116 >
注意: REAL*DOUBLEの例には、REAL列の精度の制限が示されています。REALの書式では値0.1を正確に表現できないため、DOUBLEとは若干異なる値になります。