Hitachi

Hitachi Advanced Data Binder SQLリファレンス


8.13.3 CAST

データのデータ型を変換します。

〈この項の構成〉

(1) 指定形式

スカラ関数CAST::=CAST(変換対象データ AS 変換後のデータ型)
 
  変換対象データ::={値式|NULL}
  変換後のデータ型::=データ型

(2) 指定形式の説明

変換対象データ

データ型を変換するデータを指定します。

変換対象データは,値式の形式で指定するか,またはNULLを指定します。値式については,「7.20 値式」を参照してください。

なお,変換対象データには,配列データを指定できません。

変換後のデータ型

変換後のデータ型を指定します。指定例を次に示します。

  • 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) 共通の規則

  1. 実行結果のデータ型は,変換後のデータ型に指定したデータ型になります。ただし,変換後のデータ型NUMERIC型が指定された場合,実行結果のデータ型はDECIMAL型になります。また,変換後のデータ型FLOAT型が指定された場合,実行結果のデータ型はDOUBLE PRECISION型になります。

  2. 変換対象データに?パラメタを単独で指定した場合,変換後のデータ型が?パラメタのデータ型として仮定されます。ただし,変換後のデータ型NUMERIC型が指定された場合は,?パラメタのデータ型にはDECIMAL型が仮定されます。また,変換後のデータ型FLOAT型が指定された場合は,?パラメタのデータ型にはDOUBLE PRECISION型が仮定されます。

  3. 実行結果の値は,非ナル値制約なし(ナル値を許す)となります。

  4. 変換対象データがナル値の場合,または変換対象データNULLを指定した場合,実行結果はナル値になります。

  5. 変換対象データが,実長0バイトまたは実長0文字の文字データの場合,次のように変換されます。

    • CHAR型に変換する場合:半角空白に変換されます。CHAR(3)の場合,'△△△'に変換されます。△は半角空白を意味しています。

    • VARCHAR型に変換する場合:実長0バイトまたは実長0文字のVARCHAR型のデータに変換されます。

    • BINARY型に変換する場合:X'00'に変換されます。BINARY(3)の場合,X'000000'に変換されます。

    • VARBINARY型に変換する場合:実長0バイトのVARBINARY型のデータに変換されます。

    • 上記以外のデータ型の場合:ナル値に変換されます。

  6. データ型の変換可否を次の表に示します。

    表8‒48 データ型の変換可否

    変換対象データのデータ型

    変換後のデータ型

    INTEGER,

    SMALLINT

    DECIMAL,

    NUMERIC,

    DOUBLE PRECISION

    FLOAT

    CHAR,

    VARCHAR

    DATE,TIMESTAMP

    TIME

    BINARY,

    VARBINARY

    INTEGER

    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) 文字データに変換する場合の規則

文字データへの変換規則(データ長に関する規則)を次の表に示します。

表8‒49 文字データへの変換規則(データ長に関する規則)

変換時の条件

文字データへの変換規則

変換対象データのデータ型が文字データまたはバイナリデータの場合

変換対象データのデータ型が左記以外の場合

ABの場合

変換後のデータ型がCHAR型の場合は,データを左詰めにして,余りに半角空白が格納されます。

ABの場合

変換されます。

ABの場合

データを左詰めにして,余った部分を切り捨てます。※1

変換できません。エラーになります。※2

(凡例)

A:変換対象データを文字データに変換した長さ

B:変換後のデータ型のデータ長

注※1

マルチバイト文字の途中で切り捨てが発生した場合,マルチバイト文字の一部分が実行結果の値として返されます。

注※2

変換対象データのデータ型がDOUBLE PRECISIONまたはFLOATの場合は,変換後のデータ型に指定したデータ長に収まるように仮数の小数点以下を切り捨てるため(最近接偶数への丸めを行うため),エラーにはなりません。ただし,仮数の小数点以下すべてを切り捨てても,変換後のデータ型に指定したデータ長を超える場合は,エラーになります。

INTEGER型,SMALLINTDECIMAL,または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△△△△△'

    (凡例)△:半角空白

  • 小数秒精度がpTIME型のデータをCHAR型に変換する場合,変換後のデータのデータ長が10+pバイト以上(p=0のときは9バイト以上)のときは,データを左詰めにして,余りに半角空白が格納されます。

    (例)

    CAST(TIME'11:03:58.123' AS CHAR(13)) → '11:03:58.123△'

    (凡例)△:半角空白

  • 小数秒精度がpTIMESTAMP型のデータを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型または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型または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)

  • p1P2の場合

    変換されません。

  • p1p2の場合

    p2を超えた部分の小数秒は切り捨てられます。

  • p1p2の場合

    足りない小数秒部分には0が補われます。

TIMESTAMP(p1)

DATE

日付部分だけが変換されます。

TIMESTAMP(p2)

  • p1P2の場合

    変換されません。

  • p1p2の場合

    p2を超えた部分の小数秒は切り捨てられます。

  • p1p2の場合

    足りない小数秒部分には0が補われます。

(凡例)

p1p2:小数秒精度

(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) 例題

例題

T1C2列のデータをTIMESTAMP型からDATE型に変換し,C2列が2013年7月21日の行を検索します。

SELECT * FROM "T1"
    WHERE CAST("C2" AS DATE)=DATE'2013-07-21'

[図データ]