# CAST 関数

CAST関数により値の型を他の型に変換します。また動的な引数(?)やNULL値に型を与えます。

CASTの式は式を置くことができる場所ならどこにでも置くことができます。

#### 構文

    CAST ( [ 式 | NULL | ? ]
        AS データ型)

式をキャストする先のデータ型のことを目標型といいます。キャストしようとしている式のデータ型のことを源泉型といいます。

#### CASTによるSQL-92 データ型間の変換

以下に示す表はSQLデータ型にて明示的な変換が有効な、源泉型と目標型を示します。 この表は何れのデータ型の間で明示的な変換が有効なのかを示します。 表の最初の列は源泉型を示します。表の最初の行は目標型を示します。 Yは源泉型から目標型への型の変換が有効であることを示します。 例えば、二行目の最初のコマにより源泉型はSMALLINTと記述されます。 二行目のほかのコマは、表の最初の行に書かれている型を目標型として、SMALLINTの型を変換できるか否かを記述します。

表 1. SQL-92 データ型間にて明示的な変換が有効な、源泉型と目標型
Types | S M A L L I N T | I N T E G E R | B I G I N T | D E C I M A L | R E A L | D O U B L E | F L O A T | C H A R | V A R C H A R | L O N G V A R C H A R | C H A R F O R B I T D A T A | V A R C H A R F O R B I T D A T A | L O N G V A R C H A R F O R B I T D A T A | C L O B | B L O B | D A T E | T I M E | T I M E S T A M P | X M L
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
SMALLINT | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
INTEGER | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
BIGINT | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
DECIMAL | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
REAL | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
DOUBLE | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
FLOAT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
CHAR | Y | Y | Y | Y | - | - | - | Y | Y | Y | - | - | - | Y | - | Y | Y | Y | -
VARCHAR | Y | Y | Y | Y | - | - | - | Y | Y | Y | - | - | - | Y | - | Y | Y | Y | -
LONG VARCHAR | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | - | - | - | -
CHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | Y | Y | - | - | - | -
VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | Y | Y | - | - | - | -
LONG VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | Y | Y | - | - | - | -
CLOB | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | - | - | - | -
BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | - | Y | - | - | - | -
DATE | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | - | - | -
TIME | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | - | Y | - | -
TIMESTAMP | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | Y | Y | -
XML | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | Y

変換が有効なら、CASTは可能です。源泉型と目標型の間の大きさの非互換性は、実行時にエラーを起こすことがあります。

#### 但し書き

この議論では、DerbyにてSQL-92データ型は、以下のように分類されます。

- 数
  - 正確な数 (SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC)
  - 近似の数 (FLOAT, REAL, DOUBLE PRECISION)
- 列
  - 文字列 (CLOB, CHAR, VARCHAR, LONG VARCHAR)
  - ビット列 (BLOB, CHAR FOR BIT DATA, VARCHAR FOR BIT DATA, LONG VARCHAR FOR BIT DATA)
- 日時
  - DATE
  - TIME
  - TIMESTAMP

#### 数値型からの型変換

数値型は他のいかなる数値型にも変換できます。もし数の小数部ではない部分を切り捨てなければ、変換した目標型で扱えないならば例外が発生します。もし源泉型の小数部を目標型で扱えないならば、目標型にて扱えるよう暗黙裡に源泉型の値は切り捨てられます。たとえば、763.1234をINTEGERに変換すると763となります。

#### ビット列の型への/からの型変換

ビット列の型は他のビット列の型に変換できますが、文字列に変換することはできません。 文字列の型をビット列の型に変換すると、目標のビット型の長さに会うように、末尾が0で詰められます。BLOB型はより限定されており、明示的な変換を必要とします。 ほとんどの場合、BLOB型からは/へは型変換できません。

#### 日/時の型変換

日/時の値はいかなる場合でもTIMESTAMPへ/から型変換できます。 DATEがTIMESTAMPに型変換された場合、結果のTIMESTAMPにてTIMEの部分は常に00:00:00です。 もしTIMEがTIMESTAMPに型変換された場合、結果のTIMESTAMPにてDATEの部分は、CASTが実行されたときのCURRENT_DATEの値となります。 TIMESTAMPがDATEに型変換される場合、TIMEの部分は暗黙裡に切り捨てられます。 TIMESTAMPがTIMEに型変換される場合、DATEの部分は暗黙裡に切り捨てられます。

    SELECT CAST (miles AS INT)
    FROM Flights
    -- timestampを文字列に変換する
    INSERT INTO mytable (text_column)
    VALUES (CAST (CURRENT_TIMESTAMP AS VARCHAR(100)))
    -- NULLを適切なデータ型に変換しなければならない。
    SELECT airline
    FROM Airlines
    UNION ALL
    VALUES (CAST (NULL AS CHAR(2)))
    -- doubleをdecimalに変換する。
    SELECT CAST (FLYING_TIME AS DECIMAL(5,2))
    FROM FLIGHTS
    -- SMALLINTをBIGINTに変換する
    VALUES CAST (CAST (12 as SMALLINT) as BIGINT)

#### XML値の変換

明示的にも暗黙的にも、XMLの値はXML以外の如何なる型へも型変換できません。XML型を文字列型にする場合は、XMLSERIALIZE 演算子を使ってください。

親トピック: 組み込み関数