7.21.2 値式の結果のデータ型
次の個所に指定した値式のデータ型によって結果のデータ型が決まります。
-
CASE式
-
集合演算の結果導出される列
-
表値構成子によって導出される列
-
スカラ関数COALESCE,DECODE,GREATEST,LEAST,LTDECODE,NULLIF,BITAND,BITOR,およびBITXOR
-
ウィンドウ関数LAG,およびLEAD
- (例1)CASE式の場合
-
値式1〜値式3のデータ型によって,CASE式の結果のデータ型が決まります。
- (例2)スカラ関数GREATESTの場合
-
値式1〜値式3のデータ型によって,スカラ関数GREATESTの結果のデータ型が決まります。
ここでは,結果のデータ型の決定規則について説明します。
(1) 値式のデータ型が文字データの場合
-
CASE式,スカラ関数COALESCE,DECODE,GREATEST,LEAST,LTDECODE,NULLIF,およびウィンドウ関数LAG,LEADの場合
-
結果のデータ型はVARCHAR型になります。
-
結果のデータ長は,データ長がいちばん長い値式のデータ長になります。
-
-
集合演算の結果導出される列,および表値構成子によって導出される列の場合
-
すべての値式のデータ型がCHAR型であり,かつすべてのデータ長が同じ場合は,結果のデータ型はCHAR型になります。それ以外の場合は,結果のデータ型はVARCHAR型になります。
-
結果のデータ長は,データ長がいちばん長い値式のデータ長になります。
-
(2) 値式のデータ型が数データの場合
値式のデータ型が数データの場合,結果のデータ型は次の表に示すとおりに決まります。
項番 |
値式Nのデータ型 |
値式N+1のデータ型 |
結果のデータ型 |
---|---|---|---|
1 |
SMALLINT |
SMALLINT |
SMALLINT |
2 |
INTEGER, BIGINT |
INTEGER |
|
3 |
DECIMAL, NUMERIC |
DECIMAL |
|
4 |
DOUBLE PRECISION, FLOAT |
DOUBLE PRECISION |
|
5 |
INTEGER, BIGINT |
SMALLINT |
INTEGER |
6 |
INTEGER, BIGINT |
||
7 |
DECIMAL, NUMERIC |
DECIMAL |
|
8 |
DOUBLE PRECISION, FLOAT |
DOUBLE PRECISION |
|
9 |
DECIMAL, NUMERIC |
SMALLINT |
DECIMAL |
10 |
INTEGER, BIGINT |
||
11 |
DECIMAL, NUMERIC |
||
12 |
DOUBLE PRECISION, FLOAT |
DOUBLE PRECISION |
|
13 |
DOUBLE PRECISION, FLOAT |
SMALLINT |
DOUBLE PRECISION |
14 |
INTEGER, BIGINT |
||
15 |
DECIMAL, NUMERIC |
||
16 |
DOUBLE PRECISION, FLOAT |
(凡例)N:1以上の整数
- ■結果のデータ型がDECIMAL型の場合
-
精度と位取りは次のように決まります。値式1がDECIMAL(p1,s1),値式2がDECIMAL(p2,s2),値式NがDECIMAL(pN,sN)とします。
-
精度=MIN(38,Pmax+Smax)
-
位取り=MIN(Smax,38−Pmax)
Pmax=MAX(p1−s1,p2−s2,…,pN−sN)
Smax=MAX(s1,s2,…,sN)
値式のデータ型がINTEGER型またはBIGINT型の場合は,DECIMAL(20,0)として計算してください。値式のデータ型がSMALLINT型の場合は,DECIMAL(10,0)として計算してください。
なお,結果の数データが,ここで求めた精度,位取りに収まらない場合,小数部が切り捨てられます。例を次に示します。
- 例1
-
表T1のC1列,C2列のデータ型がそれぞれDECIMAL(37,0),DECIMAL(10,2)で,値がそれぞれナル値,12345678.12の場合,次のSELECT文を実行します。
SELECT COALESCE("C1","C2") FROM "T1"
<検索結果>
12345678.1
この場合,スカラ関数COALESCEの実行結果のデータ型がDECIMAL(38,1)になり,小数部の下位の桁が切り捨てられます。
- 例2
-
行値構成子要素に1.1234567890123456789および10を指定した表値構成子から導出された導出表DTを含む次のSELECT文を実行したとします。この場合,定数1.1234567890123456789がDECIMAL(20,19),定数10がINTEGERとして扱われます。また,INTEGERはDECIMAL(20,0)として扱われるため,表値構成子から導出される列C1の結果のデータ型はDECIMAL(38,18)になります。その結果,小数部の下位の桁が切り捨てられます。
SELECT "C1" FROM (VALUES(1.1234567890123456789),(10)) "DT"("C1")
<検索結果>
1.123456789012345678 10.000000000000000000
また,次のように定数10を明示的に10進数定数の表記とし,DECIMAL型とすることで小数部の下位の桁が切り捨てられることを防ぐことができます。この場合,定数1.1234567890123456789がDECIMAL(20,19),定数10.0がDECIMAL(3,1)として扱われるため,表値構成子から導出される列C1の結果のデータ型がDECIMAL(21,19)になります。
SELECT "C1" FROM (VALUES(1.1234567890123456789),(10.0)) "DT"("C1")
<検索結果>
1.1234567890123456789 10.0000000000000000000
-
(3) 値式のデータ型が日時データの場合
値式のデータ型が日時データの場合,結果のデータ型は次の表に示すとおりに決まります。
項番 |
値式Nのデータ型 |
値式N+1のデータ型 |
結果のデータ型 |
---|---|---|---|
1 |
DATE |
DATE |
DATE |
2 |
TIMESTAMP |
TIMESTAMP※ |
|
3 |
TIME |
TIME |
TIME |
4 |
TIMESTAMP |
DATE |
TIMESTAMP※ |
5 |
TIMESTAMP |
TIMESTAMP |
(凡例)N:1以上の整数
- 注※
-
DATE型のデータをTIMESTAMP型のデータに変換します。その際,時刻部分に00:00:00を補います。
- ■小数秒精度の指定がある場合
-
値式1〜値式Nの結果に小数秒精度が含まれる場合,結果の小数秒精度は次のように決まります。値式1の小数秒精度をp1,値式2の小数秒精度をp2,値式Nの小数秒精度をpNとします。
MAX(p1,p2,…,pN)
小数秒精度によって,結果のデータ長が決まります。
(4) 値式のデータ型がバイナリデータの場合
値式のデータ型がバイナリデータの場合,結果のデータ型は次のとおりに決まります。
-
CASE式,スカラ関数COALESCE,NULLIF,およびウィンドウ関数LAG,LEADの場合
-
結果のデータ型はVARBINARY型になります。
-
結果のデータ長は,データ長がいちばん長い値式のデータ長になります。
-
-
集合演算の結果導出される列,表値構成子によって導出される列,およびスカラ関数BITAND,BITOR,BITXORの場合
-
結果のデータ型は,すべての値式のデータ型がBINARY型であり,かつすべてのデータ長が同じ場合は,BINARY型になります。それ以外の場合は,VARBINARY型になります。
-
結果のデータ長は,データ長がいちばん長い値式のデータ長になります。
-