Hitachi

Hitachi Advanced Database SQLリファレンス


7.21.2 値式の結果のデータ型

次の個所に指定した値式のデータ型によって結果のデータ型が決まります。

(例1)CASE式の場合

[図データ]

値式1〜値式3のデータ型によって,CASE式の結果のデータ型が決まります。

(例2)スカラ関数GREATESTの場合

[図データ]

値式1〜値式3のデータ型によって,スカラ関数GREATESTの結果のデータ型が決まります。

ここでは,結果のデータ型の決定規則について説明します。

〈この項の構成〉

(1) 値式のデータ型が文字データの場合

(2) 値式のデータ型が数データの場合

値式のデータ型が数データの場合,結果のデータ型は次の表に示すとおりに決まります。

表7‒19 値式のデータ型と結果のデータ型の関係(値式のデータ型が数データの場合)

値式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型の場合

精度と位取りは次のように決まります。値式1DECIMAL(p1,s1)値式2DECIMAL(p2,s2)値式NDECIMAL(pN,sN)とします。

  • 精度=MIN(38,PmaxSmax

  • 位取り=MIN(Smax,38−Pmax

Pmax=MAX(p1s1p2s2,…,pNsN

Smax=MAX(s1s2,…,sN

値式のデータ型がBIGINT型の場合はDECIMAL(20,0)INTEGER型の場合はDECIMAL(10,0)SMALLINT型の場合はDECIMAL(5,0)として計算してください。

注※

整数データ型のデータ形式がレガシー形式の場合,値式のデータ型がBIGINT型またはINTEGER型のときはDECIMAL(20,0)SMALLINT型のときはDECIMAL(10,0)として計算してください。

なお,結果の数データが,ここで求めた精度,位取りに収まらない場合,小数部が切り捨てられます。例を次に示します。

例1

T1C1列,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.1234567890123456789DECIMAL(20,19),定数10BIGINTとして扱われます。また,BIGINTDECIMAL(20,0)として扱われるため,表値構成子から導出される列C1の結果のデータ型はDECIMAL(38,18)になります。その結果,小数部の下位の桁が切り捨てられます。

SELECT "C1" FROM (VALUES(1.1234567890123456789),(10)) "DT"("C1")

<検索結果>

1.123456789012345678
10.000000000000000000

また,次のように定数10を明示的に10進数定数の表記とし,DECIMAL型とすることで小数部の下位の桁が切り捨てられることを防ぐことができます。この場合,定数1.1234567890123456789DECIMAL(20,19),定数10.0DECIMAL(3,1)として扱われるため,表値構成子から導出される列C1の結果のデータ型がDECIMAL(21,19)になります。

SELECT "C1" FROM (VALUES(1.1234567890123456789),(10.0)) "DT"("C1")

<検索結果>

1.1234567890123456789
10.0000000000000000000
注※

整数データ型のデータ形式がレガシー形式の場合はINTEGER型になります。

(3) 値式のデータ型が日時データの場合

値式のデータ型が日時データの場合,結果のデータ型は次の表に示すとおりに決まります。

表7‒20 値式のデータ型と結果のデータ型の関係(値式のデータ型が日時データの場合)

項番

値式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(p1p2,…,pN

小数秒精度によって,結果のデータ長が決まります。

(4) 値式のデータ型がバイナリデータの場合

値式のデータ型がバイナリデータの場合,結果のデータ型は次のとおりに決まります。

(5) 値式のデータ型が論理データの場合

値式のデータ型が論理データの場合,結果のデータ型は次のとおりに決まります。

(6) 値式のデータ型がUUIDデータの場合

値式のデータ型がUUIDデータの場合,結果のデータ型は次のとおりに決まります。