8.13.3 CAST
データのデータ型を変換します。
- 〈この項の構成〉
(1) 指定形式
スカラ関数CAST::=CAST(変換対象データ AS 変換後のデータ型) 変換対象データ::={値式|NULL} 変換後のデータ型::=データ型
(2) 指定形式の説明
- 変換対象データ:
-
データ型を変換するデータを指定します。
変換対象データは,値式の形式で指定するか,またはNULLを指定します。値式については,「7.21 値式」を参照してください。
なお,変換対象データには,配列データを指定できません。
- 変換後のデータ型:
-
変換後のデータ型を指定します。指定例を次に示します。
-
INTEGER
INTEGER型のデータに変換されます。
-
DECIMAL(5,2)
精度が5,位取りが2のDECIMAL型のデータに変換されます。
-
CHAR(8)
データ長8バイトのCHAR型のデータに変換されます。
各データ型の指定形式については,「6.2.1 データ型の種類」を参照してください。
なお,変換後のデータ型には,次のデータ型を指定できません。
-
データ長が32,000バイトを超えるVARCHAR型
-
配列型
-
スカラ関数CASTの実行結果の例を次に示します。
- (例)
-
DECIMAL型のデータ(-12.37)を,INTEGER型に変換します。
CAST(-12.37 AS INTEGER) → -12
(3) 規則
(a) 共通の規則
-
実行結果のデータ型は,変換後のデータ型に指定したデータ型になります。
ただし,変換後のデータ型に指定したデータ型が,実行結果のデータ型にならないデータ型もあります。
-
変換後のデータ型にBIGINT型が指定された場合,実行結果のデータ型はINTEGER型になります。
-
変換後のデータ型にNUMERIC型が指定された場合,実行結果のデータ型はDECIMAL型になります。
-
変換後のデータ型にFLOAT型が指定された場合,実行結果のデータ型はDOUBLE PRECISION型になります。
-
-
変換対象データに?パラメタを単独で指定した場合,変換後のデータ型が?パラメタのデータ型として仮定されます。
ただし,変換後のデータ型に指定したデータ型が,?パラメタのデータ型として仮定されないデータ型もあります。
-
変換後のデータ型にBIGINT型が指定された場合は,?パラメタのデータ型にはINTEGER型が仮定されます。
-
変換後のデータ型にNUMERIC型が指定された場合は,?パラメタのデータ型にはDECIMAL型が仮定されます。
-
変換後のデータ型にFLOAT型が指定された場合は,?パラメタのデータ型にはDOUBLE PRECISION型が仮定されます。
-
-
実行結果の値は,非ナル値制約なし(ナル値を許す)となります。
-
変換対象データがナル値の場合,または変換対象データにNULLを指定した場合,実行結果はナル値になります。
-
変換対象データが,実長0バイトまたは実長0文字の文字データの場合,次のように変換されます。
-
CHAR型に変換する場合:半角空白に変換されます。CHAR(3)の場合,'△△△'に変換されます。△は半角空白を意味しています。
-
VARCHAR型に変換する場合:実長0バイトまたは実長0文字のVARCHAR型のデータに変換されます。
-
BINARY型に変換する場合:X'00'に変換されます。BINARY(3)の場合,X'000000'に変換されます。
-
VARBINARY型に変換する場合:実長0バイトのVARBINARY型のデータに変換されます。
-
上記以外のデータ型の場合:ナル値に変換されます。
-
-
データ型の変換可否を次の表に示します。
表8‒48 データ型の変換可否 変換対象データのデータ型
変換後のデータ型
INTEGER,
BIGINT,
SMALLINT
DECIMAL,
NUMERIC,
DOUBLE PRECISION,
FLOAT
CHAR,
VARCHAR
DATE,TIMESTAMP
TIME
BINARY,
VARBINARY
INTEGER,
BIGINT,
SMALLINT
○
○
○
○
×
×
DECIMAL,
NUMERIC,
DOUBLE PRECISION,
FLOAT
○
○
○
×
×
×
CHAR,
VARCHAR
○
○
○
○
○
○
DATE,
TIMESTAMP
○
×
○
○
×
×
TIME
×
×
○
×
○
×
BINARY,
VARBINARY
×
×
○
×
×
○
- (凡例)
-
○:変換できます。
×:変換できません。
(b) 数データに変換する場合の規則
- ■数データを数データに変換する場合
-
数データを数データに変換する場合,「6.2.2 変換,代入,比較できるデータ型」の「(2) 格納代入できるデータ型」の「数データの格納代入」で説明している規則が適用されます。
- ■文字データを数データに変換する場合
-
-
変換対象の文字データ(文字データの前後の半角空白を取り除いた結果)が,数定数の記述形式の規則を満たしている必要があります。数定数の記述形式の規則については,「6.3.2 定数の記述形式」を参照してください。
<変換できる文字データの例>
'219','+56','-3547','-11.35','887△△','△95△'
<変換できない文字データの例>
'a89','77g9','33△49'
(凡例)△:半角空白
-
文字データが半角空白だけで構成されている場合,ナル値を返します。
-
数定数の文字列表現を数値に変換したあとに,変換後のデータ型に変換します。その際,「6.2.2 変換,代入,比較できるデータ型」の「(2) 格納代入できるデータ型」の「数データの格納代入」で説明している規則が適用されます。
(例)
CAST('11.35' AS INTEGER) → 11
いったん文字列'11.35'がDECIMAL型の数値11.35に変換され,そのあとにINTEGER型の数値に変換されます。その際,数データの格納代入の規則が適用され,この例の場合,小数点以下が切り捨てられます。
-
- ■日時データを数データに変換する場合
-
西暦1年1月1日からの通算日に変換されます。西暦1年1月1日の場合,通算日は1になります。西暦1年1月2日の場合,通算日は2になります。
(例)
CAST(DATE'0001-01-03' AS INTEGER) → 3
CAST(TIMESTAMP'0001-01-05 11:03:58' AS INTEGER) → 5
(c) 文字データに変換する場合の規則
文字データへの変換規則(データ長に関する規則)を次の表に示します。
変換時の条件 |
文字データへの変換規則 |
|
---|---|---|
変換対象データのデータ型が文字データまたはバイナリデータの場合 |
変換対象データのデータ型が左記以外の場合 |
|
A<Bの場合 |
変換後のデータ型がCHAR型の場合は,データを左詰めにして,余りに半角空白が格納されます。 |
|
A=Bの場合 |
変換されます。 |
|
A>Bの場合 |
データを左詰めにして,余った部分を切り捨てます。※1 |
変換できません。エラーになります。※2 |
- (凡例)
-
A:変換対象データを文字データに変換した長さ
B:変換後のデータ型のデータ長
- 注※1
-
マルチバイト文字の途中で切り捨てが発生した場合,マルチバイト文字の一部分が実行結果の値として返されます。
- 注※2
-
変換対象データのデータ型がDOUBLE PRECISION型またはFLOAT型の場合は,変換後のデータ型に指定したデータ長に収まるように仮数の小数点以下を切り捨てるため(最近接偶数への丸めを行うため),エラーにはなりません。ただし,仮数の小数点以下すべてを切り捨てても,変換後のデータ型に指定したデータ長を超える場合は,エラーになります。
- ■INTEGER型,BIGINT型,SMALLINT型,DECIMAL型,またはNUMERIC型の数データを文字データに変換する場合
-
-
数データを数定数の形式に変換した結果を文字データとして出力します。その際,数定数で表現可能な形式のうち,最も短い形式で結果が出力されます。
ただし,DECIMAL型またはNUMERIC型のデータの場合は,次のように変換されます。
・小数点以下の桁数は,数データのデータ型の位取りと同じになり,末尾からの0は削除されません。
・「数データのデータ型の精度>位取り」の場合,整数部の桁数は0にはなりません。
・小数点は必ず付加されます。
(例)+0025.100 → '25.100'
上記のように,+の符号は削除されます。また,整数部分の先頭からの0は削除されます。
-
変換対象データが0未満の場合,先頭に負符号(−)が付加されます。
-
- ■DOUBLE PRECISION型またはFLOAT型の数データを文字データに変換する場合
-
-
数データを浮動小数点数定数の形式に変換した結果を文字データとして出力します。その際,浮動小数点数定数で表現可能な形式のうち,最も短い形式で結果が出力されます。
(例)
+1.0000000000000000E+010 → '1E10'
+3.2000000000000000E+001 → '3.2E1'
+0.1000000000000000E+001 → '1E0'
+0.0000000000000000E+000 → '0E0'
上記のように,仮数の+の符号は削除され,小数点以下の末尾からの0も削除されます。指数の+の符号は削除され,指数の先頭からの0も削除されます。
-
変換対象データが0未満の場合は,先頭に負符号(−)が付加されます。
-
0未満の指数には,先頭に負符号(−)が付加されます。
-
- ■日時データを文字データに変換する場合
-
-
日時データを文字データに変換する場合,既定の出力表現の形式に変換されます。DATE型のデータを文字データに変換する場合は,日付を表す既定の出力表現の形式に変換されます。TIME型のデータを文字データに変換する場合は,時刻を表す既定の出力表現の形式に変換されます。TIMESTAMP型のデータを文字データに変換する場合は,時刻印を表す既定の出力表現の形式に変換されます。既定の出力表現については,「6.3.3 既定の文字列表現」を参照してください。
(例)
CAST(DATE'2013-06-30' AS CHAR(10)) → '2013-06-30'
CAST(DATE'0001-01-01' AS CHAR(10)) → '0001-01-01'
CAST(TIME'05:33:48.123' AS CHAR(12)) → '05:33:48.123'
CAST(TIMESTAMP'2013-06-30 11:03:58' AS CHAR(19)) → '2013-06-30 11:03:58'
-
日時データをCHAR(n)またはVARCHAR(n)に変換する場合,次の条件を満たす必要があります。
変換対象データのデータ型
変換後のデータ長の条件
DATE
n≧10
TIME(p)
p=0の場合
n≧8
p>0の場合
n≧9+p
TIMESTAMP(p)
p=0の場合
n≧19
p>0の場合
n≧20+p
nが上記の長さより短い場合は変換できません。
-
DATE型のデータをCHAR型に変換する場合,変換後のデータのデータ長が11バイト以上のときは,データを左詰めにして,余りに半角空白が格納されます。
(例)
CAST(DATE'2013-06-30' AS CHAR(15)) → '2013-06-30△△△△△'
(凡例)△:半角空白
-
小数秒精度がpのTIME型のデータをCHAR型に変換する場合,変換後のデータのデータ長が10+pバイト以上(p=0のときは9バイト以上)のときは,データを左詰めにして,余りに半角空白が格納されます。
(例)
CAST(TIME'11:03:58.123' AS CHAR(13)) → '11:03:58.123△'
(凡例)△:半角空白
-
小数秒精度がpのTIMESTAMP型のデータをCHAR型に変換する場合,変換後のデータのデータ長が21+pバイト以上(p=0のときは20バイト以上)のときは,データを左詰めにして,余りに半角空白が格納されます。
(例)
CAST(TIMESTAMP'2013-06-30 11:03:58' AS CHAR(20)) → '2013-06-30 11:03:58△'
(凡例)△:半角空白
-
- ■バイナリデータを文字データに変換する場合
-
-
データ型が変換されるだけで,データの内容(文字コード自体)は変換されません。
(例)
CAST(X'61626364' AS CHAR(4)) → 'abcd'
-
「変換対象データのデータ長>変換後のデータ型のデータ長」の場合,末尾が切り捨てられます。
(例)
CAST(X'61626364' AS CHAR(3)) → 'abc'
下線部分が切り捨てられます。
-
「変換対象データのデータ長<変換後のデータ型のデータ長」の場合,末尾に半角空白が格納されます。
(例)
CAST(X'61626364' AS CHAR(5)) → 'abcd△'
(凡例)△:半角空白
-
(d) 日時データに変換する場合の規則
- ■INTEGER型,BIGINT型,またはSMALLINT型の数データを日時データに変換する場合
-
-
西暦1年1月1日を起点として変換されます。
-
TIMESTAMP型の時刻部分は'00:00:00'に変換され,小数秒部分には0が補われます。例を次に示します。
(例)
CAST(2 AS DATE) → DATE'0001-01-02'
CAST(2 AS TIMESTAMP(3)) → TIMESTAMP'0001-01-02 00:00:00.000'
-
INTEGER型,BIGINT型,またはSMALLINT型のデータが1〜3,652,059の場合に変換できます。範囲外の場合はエラーになります。
-
- ■文字データを日時データに変換する場合
-
-
変換対象の文字データ(文字データの前後の半角空白を取り除いた結果)が,日付を表す既定の入力表現の形式に従っている場合に限り,文字データをDATE型のデータに変換できます。日付を表す既定の入力表現については,「6.3.3 既定の文字列表現」の「(1) 日付を表す既定の文字列表現」の「(a) 既定の入力表現」を参照してください。
(例)
CAST('2014-07-22△△' AS DATE) → DATE'2014-07-22'
<変換できる文字データの例>
'2014-06-30','0001-01-02','△△2014-07-30','△2014/07/30△△'
<変換できない文字データの例>
'2013△06△30','2013.06.30'
(凡例)△:半角空白
-
変換対象の文字データ(文字データの前後の半角空白を取り除いた結果)が,時刻を表す既定の入力表現の形式に従っている場合に限り,文字データをTIME型のデータに変換できます。時刻を表す既定の入力表現については,「6.3.3 既定の文字列表現」の「(2) 時刻を表す既定の文字列表現」の「(a) 既定の入力表現」を参照してください。
(例)
CAST('△19:46:23.123456' AS TIME(6)) → TIME'19:46:23.123456'
<変換できる文字データの例>
'18:05:22','10:21:44.123','△△10:21:44.123456△'
<変換できない文字データの例>
'18△05△22','10:21:44△123456'
(凡例)△:半角空白
-
変換対象の文字データ(文字データの前後の半角空白を取り除いた結果)が,時刻印を表す既定の入力表現の形式に従っている場合に限り,文字データをTIMESTAMP型のデータに変換できます。時刻印を表す既定の入力表現については,「6.3.3 既定の文字列表現」の「(3) 時刻印を表す既定の文字列表現」の「(a) 既定の入力表現」を参照してください。
(例)
CAST('2014/08/02 11:03:58.123456△' AS TIMESTAMP(6)) → TIMESTAMP'2014-08-02 11:03:58.123456'
<変換できる文字データの例>
'2014-06-30 11:03:58','2014/07/30 11:03:58.123','△2014/07/30 11:03:58.123456789△△'
<変換できない文字データの例>
'2014-06-30 11-03-58','2014/07/30 11:03:58:123456'
(凡例)△:半角空白
-
「変換対象の文字データの小数秒の桁数>変換後のデータ型の小数秒の桁数」の場合,変換後のデータ型の小数秒の桁数を超えた部分の小数秒は切り捨てられます。
(例)
CAST('19:46:23.123456' AS TIME(3)) → TIME'19:46:23.123'
-
「変換対象の文字データの小数秒の桁数<変換後のデータ型の小数秒の桁数」の場合,足りない小数秒部分に0が補われます。
(例)
CAST('2014-08-02 11:03:58.123' AS TIMESTAMP(9)) → TIMESTAMP'2014-08-02 11:03:58.123000000'
-
文字データが半角空白だけで構成されている場合,ナル値を返します。
-
- ■日時データを日時データに変換する場合
-
日時データを日時データに変換する場合の変換規則を次の表に示します。
表8‒50 日時データを日時データに変換する場合の変換規則 変換対象データのデータ型
変換後のデータ型の指定
変換規則
DATE
DATE
変換されません。
TIMESTAMP(p2)
-
時刻部分は'00:00:00'に変換されます。
-
小数秒部分には0が補われます。
TIME(p1)
TIME(p2)
-
p1=P2の場合
変換されません。
-
p1>p2の場合
p2を超えた部分の小数秒は切り捨てられます。
-
p1<p2の場合
足りない小数秒部分には0が補われます。
TIMESTAMP(p1)
DATE
日付部分だけが変換されます。
TIMESTAMP(p2)
-
p1=P2の場合
変換されません。
-
p1>p2の場合
p2を超えた部分の小数秒は切り捨てられます。
-
p1<p2の場合
足りない小数秒部分には0が補われます。
- (凡例)
-
p1,p2:小数秒精度
-
(e) バイナリデータに変換する場合の規則
- ■文字データをバイナリデータに変換する場合
-
-
データ型が変換されるだけで,データの内容(文字コード自体)は変換されません。
(例)
CAST('abcd' AS BINARY(4)) →X'61626364'
-
「変換対象データのデータ長>変換後のデータ型のデータ長」の場合,末尾が切り捨てられます。
(例)
CAST('abcd' AS BINARY(3)) → X'616263'
下線部分が切り捨てられます。
マルチバイト文字の途中で切り捨てが発生した場合,マルチバイト文字の一部分が実行結果の値として返されます。
-
「変換対象データのデータ長<変換後のデータ型のデータ長」の場合,末尾にX'00'が格納されます。
(例)
CAST('abcd' AS BINARY(5)) → X'6162636400'
-
- ■バイナリデータをバイナリデータに変換する場合
-
-
「変換対象データのデータ長>変換後のデータ型のデータ長」の場合,末尾が切り捨てられます。
(例)
CAST(X'61626364' AS BINARY(3)) → X'616263'
下線部分が切り捨てられます。
マルチバイト文字の途中で切り捨てが発生した場合,マルチバイト文字の一部分が実行結果の値として返されます。
-
「変換対象データのデータ長<変換後のデータ型のデータ長」の場合,末尾にX'00'が格納されます。
(例)
CAST(X'61626364' AS BINARY(5)) → X'6162636400'
-
(4) 例題
- 例題
-
表T1のC2列のデータをTIMESTAMP型からDATE型に変換し,C2列が2013年7月21日の行を検索します。
SELECT * FROM "T1" WHERE CAST("C2" AS DATE)=DATE'2013-07-21'