7.21.2 値式の結果のデータ型
次の個所に指定した値式のデータ型によって結果のデータ型が決まります。
-
CASE式
-
集合演算の結果導出される列
-
表値構成子によって導出される列
-
ADB_GENERATE_SERIES関数を指定した表関数導出表によって導出される列
-
スカラ関数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の場合
-
CASE式または上記の関数の結果のデータ型はVARCHAR型になります。
-
CASE式または上記の関数の結果のデータ長は,指定した値式の中で最も長いデータ長と同じになります。
ただし,CASE式または上記の関数に指定した値式のうち,データ型がSTRING型となる値式が1つでもある場合は,CASE式または上記の関数の結果のデータ型はSTRING型になり,結果のデータ長は32,000,000バイトになります。
-
-
集合演算の結果導出される列,および表値構成子によって導出される列の場合
-
すべての値式のデータ型がCHAR型であり,かつすべてのデータ長が同じ場合は,結果のデータ型はCHAR型になります。それ以外の場合は,結果のデータ型はVARCHAR型になります。
-
結果のデータ長は,データ長がいちばん長い値式のデータ長になります。
ただし,値式のデータ型がSTRING型となる値式が1つでもある場合は,結果のデータ型はSTRING型になり,結果のデータ長は32,000,000バイトになります。
-
(2) 値式のデータ型が数データの場合
値式のデータ型が数データの場合,結果のデータ型は次の表に示すとおりに決まります。
|
値式Nのデータ型 |
値式N+1のデータ型 |
結果のデータ型 |
|---|---|---|
|
BIGINT |
BIGINT |
BIGINT※1 |
|
INTEGER |
||
|
SMALLINT |
||
|
DECIMAL |
DECIMAL |
|
|
NUMERIC |
||
|
DOUBLE PRECISION |
DOUBLE PRECISION |
|
|
FLOAT |
||
|
REAL |
||
|
INTEGER |
BIGINT |
BIGINT※1 |
|
INTEGER |
INTEGER |
|
|
SMALLINT |
||
|
DECIMAL |
DECIMAL |
|
|
NUMERIC |
||
|
DOUBLE PRECISION |
DOUBLE PRECISION |
|
|
FLOAT |
||
|
REAL |
REAL※2 |
|
|
SMALLINT |
BIGINT |
BIGINT※1 |
|
INTEGER |
INTEGER |
|
|
SMALLINT |
SMALLINT |
|
|
DECIMAL |
DECIMAL |
|
|
NUMERIC |
||
|
DOUBLE PRECISION |
DOUBLE PRECISION |
|
|
FLOAT |
||
|
REAL |
REAL |
|
|
DECIMAL, NUMERIC |
BIGINT |
DECIMAL |
|
INTEGER |
||
|
SMALLINT |
||
|
DECIMAL |
||
|
NUMERIC |
||
|
DOUBLE PRECISION |
DOUBLE PRECISION |
|
|
FLOAT |
||
|
REAL |
||
|
DOUBLE PRECISION, FLOAT |
BIGINT |
DOUBLE PRECISION |
|
INTEGER |
||
|
SMALLINT |
||
|
DECIMAL |
||
|
NUMERIC |
||
|
DOUBLE PRECISION |
||
|
FLOAT |
||
|
REAL |
||
|
REAL |
BIGINT |
DOUBLE PRECISION |
|
INTEGER |
REAL※2 |
|
|
SMALLINT |
REAL |
|
|
DECIMAL |
DOUBLE PRECISION |
|
|
NUMERIC |
||
|
DOUBLE PRECISION |
||
|
FLOAT |
||
|
REAL |
REAL |
(凡例)N:1以上の整数
- 注※1
-
整数データ型のデータ形式がレガシー形式の場合はINTEGER型になります。
- 注※2
-
整数データ型のデータ形式がレガシー形式の場合はDOUBLE PRECISION型になります。
- ■結果のデータ型が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)
値式のデータ型がBIGINT型の場合はDECIMAL(20,0),INTEGER型の場合はDECIMAL(10,0),SMALLINT型の場合はDECIMAL(5,0)として計算してください。※
- 注※
-
整数データ型のデータ形式がレガシー形式の場合,値式のデータ型がBIGINT型またはINTEGER型のときは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がBIGINT型※として扱われます。また,BIGINT型※は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
- 注※
-
整数データ型のデータ形式がレガシー形式の場合はINTEGER型になります。
-
(3) 値式のデータ型が日時データの場合
値式のデータ型が日時データの場合,結果のデータ型は次の表に示すとおりに決まります。
|
項番 |
値式Nのデータ型 |
値式N+1のデータ型 |
結果のデータ型 |
|---|---|---|---|
|
1 |
DATE |
DATE |
DATE |
|
2 |
TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMP WITHOUT TIME ZONE※ |
|
|
3 |
TIME |
TIME |
TIME |
|
4 |
TIMESTAMP WITHOUT TIME ZONE |
DATE |
TIMESTAMP WITHOUT TIME ZONE※ |
|
5 |
TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMP WITHOUT TIME ZONE |
|
|
6 |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP WITH TIME ZONE |
(凡例)N:1以上の整数
- 注※
-
DATE型のデータをTIMESTAMP WITHOUT TIME ZONE型のデータに変換します。その際,時刻部分に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型になります。
-
結果のデータ長は,データ長がいちばん長い値式のデータ長になります。
-
(5) 値式のデータ型が論理データの場合
値式のデータ型が論理データの場合,結果のデータ型は次のとおりに決まります。
-
CASE式,スカラ関数COALESCE,DECODE,GREATEST,LEAST,LTDECODE,NULLIF,およびウィンドウ関数LAG,LEADの場合
結果のデータ型はBOOLEAN型になります。
-
集合演算の結果導出される列,表値構成子によって導出される列の場合
結果のデータ型はBOOLEAN型になります。
(6) 値式のデータ型がUUIDデータの場合
値式のデータ型がUUIDデータの場合,結果のデータ型は次のとおりに決まります。
-
CASE式,スカラ関数COALESCE,DECODE,GREATEST,LEAST,LTDECODE,NULLIF,およびウィンドウ関数LAG,LEADの場合
結果のデータ型はUUID型になります。
-
集合演算の結果導出される列,表値構成子によって導出される列の場合
結果のデータ型はUUID型になります。