2.25.1 CAST指定の形式と規則
- 〈この項の構成〉
(1) 機能
値式のデータを,指定したデータ型に変換します。
(2) 形式
CAST指定::=CAST({値式|NULL} AS データ型)
(3) 規則
-
値式には,次のデータ型は指定できません。
-
BLOB
-
定義長が32,001バイト以上のBINARY
-
抽象データ型
-
-
AS データ型には,次のデータ型は指定できません。
-
BLOB
ただし,CAST(NULL AS BLOB)は指定できます。
-
長さが32,001バイト以上のBINARY
ただし,CAST(NULL AS BINARY(n))は指定できます。nは32,001以上のバイト数です。
-
BOOLEAN
-
抽象データ型
-
-
結果の値は,非ナル値制約なし(ナル値を許します)になります。
-
値式にNULLを指定するか,又は値式の結果がナル値の場合,結果の値はナル値になります。
-
実長0バイト,又は実長0文字のデータを値式に指定した場合,文字型への変換はデータ変換の規則に従います。文字型以外への変換では,エラーになります。
-
値式に埋込み変数又は?パラメタを単独で指定した場合,埋込み変数又は?パラメタのデータ型は,AS データ型に指定したデータ型が仮定されます。
-
値式に繰返し列を指定する場合,添字を指定してください。ただし,添字にANYは指定できません。
-
値式に予備列は指定できません。
-
AS データ型には,値式に指定するデータ型と型変換できるデータ型を指定してください。データ型の変換可否を次の表に示します。
表2‒110 値式の結果のデータ型とAS データ型との,データ型の変換可否(1/2) 値式の結果のデータ型
AS データ型
数データ
文字データ(文字集合)
各国文字データ
混在文字データ
真数
概数
INTEGER,SMALLINT,DECIMAL
FLOAT,SMALLFLT
CHAR,VARCHAR
NCHAR,NVARCHAR
MCHAR,MVARCHAR
DF
EK
U16
数データ
真数
INTEGER,SMALLINT,DECIMAL
○
○
○
○
○
×
○
概数
FLOAT,SMALLFLT
○
○
○
○
○
×
○
文字データ(文字集合)
CHAR,VARCHAR(DF)
○
○
○
○※2
○
×
○
CHAR,VARCHAR(EK)
○
○
○※2
○
×
×
×
CHAR,VARCHAR(U16)
○
○
○
×
○
×
○
各国文字データ
NCHAR,NVARCHAR
×
×
×
×
×
○
×
混在文字データ
MCHAR,MVARCHAR
○
○
○
×
○
×
○
論理データ
BOOLEAN
×
×
○
○
○
×
○
日付データ
DATE
×
×
○
※1
○
※1
○
※1
×
○※1
時刻データ
TIME
×
×
○
※1
○
※1
○
※1
×
○※1
時刻印データ
TIMESTAMP
×
×
○
※1
○
※1
○
※1
×
○※1
日間隔データ
INTERVAL YEAR TO DAY
○
×
×
×
×
×
×
時間隔データ
INTERVAL HOUR TO SECOND
○
×
×
×
×
×
×
バイナリデータ
BINARY
×
×
○
○
○
×
×
- (凡例)
-
○:データ変換ができます。
×:データ変換ができません。
DF:既定文字集合
EK:EBCDIK
U16:UTF16
- 注※1
-
AS データ型に指定した長さが,次に示す長さ以上の場合は変換できます。
・値式の結果の文字集合がUTF16以外の場合
DATEの場合:
10バイト
TIMEの場合:
8バイト
TIMESTAMP(p)の場合:
p=0のときは19バイト(ピリオドは付きません)
p>0のときは20+↓(p+1)/2↓×2バイト
・値式の結果の文字集合がUTF16の場合
DATEの場合:
20バイト
TIMEの場合:
16バイト
TIMESTAMP(p)の場合:
p=0のときは38バイト(ピリオドは付きません)
p>0のときは40+↓(p+1)/2↓×4バイト
ASデータ型に指定した長さが,上記の長さより短い場合は変換できません。
固定長の文字データ型に変換する場合で,ASデータ型に指定した長さが上記の長さより長い場合は,左詰めにして,末尾をその文字集合の空白で埋めます。
- 注※2
-
既定文字集合のSJISコードをJIS8コードの1バイトコードとみなして,JIS8コードとEBCDIKコードとの間の変換を行います。
文字コード変換規則については,マニュアル「HiRDB UAP開発ガイド」を参照してください。
表2‒111 値式の結果のデータ型とAS データ型との,データ型の変換可否(2/2) 値式の結果のデータ型
AS データ型
日付データ
時刻データ
時刻印データ
日間隔データ
時間隔データ
バイナリデータ
DATE
TIME
TIMESTAMP
INTERVAL YEAR TO DAY
INTERVAL HOUR TO SECOND
BINARY
数データ
真数
INTEGER,SMALLINT,DECIMAL
×
×
×
○
○
×
概数
FLOAT,SMALLFLT
×
×
×
×
×
×
文字データ
CHAR,VARCHAR(DF)
○
○
○
×
×
○
CHAR,VARCHAR(EK)
○
○
○
×
×
○
CHAR,VARCHAR(U16)
○
○
○
×
×
○
各国文字データ
NCHAR,NVARCHAR
×
×
×
×
×
×
混在文字データ
MCHAR,MVARCHAR
○
○
○
×
×
×
論理データ
BOOLEAN
×
×
×
×
×
×
日付データ
DATE
○
×
○
×
×
×
時刻データ
TIME
×
○
○
×
×
×
時刻印データ
TIMESTAMP
○
○
○
×
×
×
日間隔データ
INTERVAL YEAR TO DAY
×
×
×
○
○
×
時間隔データ
INTERVAL HOUR TO SECOND
×
×
×
○
○
×
バイナリデータ
BINARY
×
×
×
×
×
○
- (凡例)
-
○:データ変換ができます。
×:データ変換ができません。
DF:既定文字集合
EK:EBCDIK
U16:UTF16
-
ウィンドウ関数は指定できません。
(4) 結果のデータ型ごとの変換規則
(a) 数データ
-
値式の結果が数データの場合
変換対象のデータ型で,上位有効けたを失ってはなりません。
-
値式の結果が文字列,及び混在文字列の場合
データの前後の半角空白を取り除いた結果が,数定数の文字列表現でなければなりません。数定数の文字列表現を数値に変換した後,値式の結果が数データの規則に従います。
-
値式の結果が日間隔データ,及び時間隔データの場合
結果のデータ型(DECIMAL)の精度及び位取りが次の表の場合,日間隔データ,又は時間隔データの10進数形式に変換します。
表2‒112 日間隔データ,及び時間隔データから数値データへの変換規則 値式の結果のデータ型
AS データ型に指定した長さ
INTERVAL YEAR TO DAY
精度8,位取り0
INTERVAL HOUR TO SECOND
精度6,位取り0
(b) 文字データ,及び混在文字データ
-
文字データ,及び混在文字データに変換する場合の変換規則を次の表に示します。
表2‒113 文字データ,及び混在文字データへの変換規則 値式の結果の長さと,AS データ型の長さの関係
値式の結果のデータ型
文字データ,及び混在文字データ
文字データ,及び混在文字データ以外
値式の結果の長さ<AS データ型に指定した長さ
AS データ型に指定したデータ型が固定長の場合,左詰めにして末尾を空白(結果のデータ型の文字集合の空白)で埋めます。
値式の結果の長さ=AS データ型に指定した長さ
正常に変換します。
値式の結果の長さ>AS データ型に指定した長さ
左詰めにして末尾を切り捨てます。切り捨てる部分のデータに空白(結果のデータ型の文字集合の空白)以外の文字があれば,SQLWARN1領域に'W'を設定します。※
エラーになります。
- 注※
-
マルチバイト文字の途中で切り捨てが発生する場合,マルチバイト文字の一部分が結果の値として返されます。
-
値式の結果が真数(SMALLINT,INTEGER,及びDECIMAL)の場合
データを数定数に変換した結果,最短となる(先頭の0は取り除く)文字列が結果となります。
データが0未満の場合は,先頭に負符号(-)を付加します。
-
値式の結果が概数(SMALLFLT,及びFLOAT)の場合
データを数定数に変換した結果,最短となる文字列(先頭は0以外です。ただし,データが0の場合は0E0となります)が結果となります。
データが0未満の場合は,先頭に負符号(-)を付加します。
-
値式の結果が文字列,混在文字列の場合
値式の結果のデータ長が,AS データ型に指定した長さを超える場合,左詰めにして末尾を切り捨てます。切り捨てる部分のデータ中に空白(結果のデータ型の文字集合の空白)以外の文字が含まれていると,SQLWARN1領域に'W'が設定されます。
また,値式の結果が文字集合指定をした文字データの場合,値式のすべての文字をその文字集合の文字の並びとして変換します。
-
値式の結果が論理データの場合
値式の結果が真の場合は変換結果は'TRUE',値式の結果が偽の場合は変換結果は'FALSE',値式の結果が不定の場合は変換結果はナル値となります。
-
値式の結果が日付データ,時刻データ,及び時刻印データの場合
日付データ,時刻データ,及び時刻印データの規定の文字列表現に変換します。
-
値式の結果がバイナリデータの場合
値式の結果のデータ長が,結果のデータ型に指定したデータ長を超える場合,SQLWARN1領域に'W'が設定されます。
(c) 各国文字データ
-
値式の結果が各国文字列の場合
結果のデータ型が固定長で,値式のデータを各国文字列に変換した結果,AS データ型に指定した長さより短い場合は,文字コードに対応した全角空白で埋めます。
値式のデータを各国文字列に変換した結果,結果のデータ型に指定したデータ長を超える場合は,左詰めにして末尾を切り捨てます。切り捨てる部分のデータ中に文字コードに対応した全角空白以外の文字が含まれていると,SQLWARN1領域に'W'が設定されます。
(d) 日付データ,時刻データ,及び時刻印データ
-
値式の結果が文字列,及び混在文字列の場合
日付データ,時刻データ,及び時刻印データの,規定の文字列表現であれば変換できます。ただし,値式のデータの前後の空白(結果のデータ型の文字集合の空白)を取り除き,その結果の小数秒精度が0,2,4,及び6でない場合はエラーとなります。
-
値式の結果が日付データ,時刻データ,及び時刻印データの場合
次の表に示す組み合わせで変換できます。
表2‒114 日付データ,時刻データ,及び時刻印データの変換規則 値式の結果のデータ型
AS データ型
変換規則
DATE
DATE
変換しません。
TIMESTAMP(p2)
時刻部分を'00:00:00'として変換します。小数秒部は0で埋めます。
TIME
TIME
変換しません。
TIMESTAMP(p2)
日付部分をCURRENT_DATEに変換します。小数秒部は0で埋めます。
TIMESTAMP(p1)
DATE
日付部分を抽出して変換します。
TIME
時刻部分を抽出して変換します。
TIMESTAMP(p2)
変換しません。
ただし,p1>p2の場合は小数秒部を切り捨て,p1<p2の場合は小数秒部を0で埋めます。
(e) 日間隔データ,及び時間隔データ
-
値式の結果がDECIMALの場合
精度及び位取りが次の表の場合に,対応する日間隔データ,又は時間隔データに変換できます。
表2‒115 数データから日間隔データ,又は時間隔データへの変換規則 数データの形式
値式の結果のデータ型
精度8,位取り0
INTERVAL YEAR TO DAY
精度6,位取り0
INTERVAL HOUR TO SECOND
-
値式の結果が日間隔データ,及び時間隔データの場合
次の表に示す組み合わせで変換できます。
表2‒116 日間隔データ,及び時間隔データの変換規則 値式の結果のデータ型
AS データ型
変換規則
INTERVAL YEAR TO DAY
INTERVAL YEAR TO DAY
変換しません。
INTERVAL HOUR TO SECOND
日付部分を時刻部分に変換し,INTERVAL HOUR TO SECONDの値の範囲を超えなければ変換できます。超える場合はエラーとなります。
INTERVAL HOUR TO SECOND
INTERVAL YEAR TO DAY
時刻部分が24時間以上の場合に,日付部分に繰り上げます。24時間未満のデータは切り捨てます。
INTERVAL HOUR TO SECOND
変換しません。
(f) バイナリデータ
-
値式の結果が文字列の場合
値式のデータをBINARYに変換した結果,AS データ型に指定した長さを超える場合,SQLWARN1領域に'W'が設定されます。