AnalyticDB for MySQL では、CAST を使用して、あるデータ型の値を別のデータ型に変換します。
構文
CAST(expr AS type)| パラメーター | 必須 | 説明 |
|---|---|---|
expr | はい | 変換するソース値または式。 |
type | はい | 変換先のデータ型。 |
サポートされる変換
次の表に、CAST でサポートされる変換先の型と、それぞれが受け入れるソースの型を示します。
| 宛先タイプ | 受け入れ可能なソースの型 |
|---|---|
| BOOLEAN | DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DOUBLE、VARCHAR、JSON |
| DECIMAL(M,D)、FLOAT、INT、INTEGER、SMALLINT、TINYINT | DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DOUBLE、VARCHAR、JSON |
| BIGINT | BOOLEAN、DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、DOUBLE、DATE、DATETIME、TIMESTAMP、TIME、VARCHAR |
| DOUBLE | BOOLEAN、DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DATE、DATETIME、TIMESTAMP、TIME、VARCHAR、JSON |
| DATE、DATETIME、TIMESTAMP、TIME | DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DOUBLE、DATE、DATETIME、TIMESTAMP、TIME、VARCHAR、JSON |
| VARBINARY | BOOLEAN、DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DOUBLE、DATE、DATETIME、TIMESTAMP、TIME、VARCHAR、JSON |
| VARCHAR | BOOLEAN、DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DOUBLE、DATE、DATETIME、TIMESTAMP、TIME、VARBINARY、MAP、JSON |
| ARRAY\<element_type\> | VARCHAR、JSON |
| MAP\<key_type, value_type\> | VARCHAR |
| JSON | BOOLEAN、DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT、DOUBLE、VARCHAR、ARRAY |
VARBINARY から VARCHAR への変換には、AnalyticDB for MySQL V3.1.4 以降が必要です。
変換失敗時の動作
変換が失敗した場合の結果は、ソースの型と変換先の型によって異なります。
| シナリオ | 結果 |
|---|---|
| VARCHAR または BIGINT の値が TIME 形式と一致しない | NULL |
| 範囲外の値が数値型 (INT グループを除く) にキャストされる | NULL |
| 非数値の VARCHAR が DECIMAL(M,D) または FLOAT にキャストされる | NULL |
| 数値ではない JSON が BIGINT または DOUBLE にキャストされる | NULL |
| JSON 形式ではない VARCHAR が JSON にキャストされる | NULL |
| 範囲外の値が INT/INTEGER、SMALLINT、または TINYINT にキャストされる | NULL |
| 非数値の VARCHAR が INT/INTEGER、SMALLINT、または TINYINT にキャストされる | 0 |
| 数値ではない JSON が INT/INTEGER、SMALLINT、または TINYINT にキャストされる | エラー |
| ARRAY 形式ではない値が ARRAY にキャストされる | エラー |
| MAP 形式ではない値が MAP にキャストされる | エラー |
CAST AS BOOLEAN
CAST(expr AS BOOLEAN)expr を BOOLEAN に変換します。結果は常に 1 (true) または 0 (false) になります。
変換ルール
| ソースの型 | ルール |
|---|---|
| VARCHAR、JSON | true または 1 → 1、false または 0 → 0、その他のすべての値 → NULL |
| DOUBLE | 0.0 以外 → 1、0.0 → 0 |
| DECIMAL(M,D)、FLOAT、INT/INTEGER、SMALLINT、TINYINT、BIGINT | ゼロ以外 → 1、0 → 0 |
例
-- VARCHAR '1' を BOOLEAN にキャスト
SELECT CAST('1' AS BOOLEAN);+----------------------+
| CAST('1' AS BOOLEAN) |
+----------------------+
| 1 |
+----------------------+-- ブール値以外の文字列は NULL を返す
SELECT CAST('a' AS BOOLEAN);NULL-- ゼロ以外の DOUBLE は 1 を返す
SELECT CAST(4.3 AS BOOLEAN);+----------------------+
| CAST(4.3 AS BOOLEAN) |
+----------------------+
| 1 |
+----------------------+-- ゼロ以外の INT は 1 を返す
SELECT CAST(5 AS BOOLEAN);+--------------------+
| CAST(5 AS BOOLEAN) |
+--------------------+
| 1 |
+--------------------+CAST AS DECIMAL(M,D)|FLOAT|INT|INTEGER|SMALLINT|TINYINT
CAST(expr AS [DECIMAL(M,D)|FLOAT|INT|INTEGER|SMALLINT|TINYINT])expr を数値型 (DECIMAL(M,D)、FLOAT、INT、INTEGER、SMALLINT、または TINYINT) のいずれかに変換します。
変換ルール
範囲外の値は NULL を返します。たとえば、
99999999は SMALLINT の範囲を超えています:SELECT CAST(99999999 AS SMALLINT);NULL高精度から低精度への変換では、値が四捨五入されます:
SELECT CAST(1.23456789 AS FLOAT);+---------------------------+ | CAST(1.23456789 AS FLOAT) | +---------------------------+ | 1.2345679 | +---------------------------+DECIMAL(M,D)、DOUBLE、または FLOAT から INT/INTEGER、SMALLINT、または TINYINT への変換では、値が四捨五入されます:
SELECT CAST(1.1342 AS INT);+---------------------+ | CAST(1.1342 AS INT) | +---------------------+ | 1 | +---------------------+非数値の VARCHAR から DECIMAL(M,D) または FLOAT への変換では、NULL が返されます:
SELECT CAST('China' AS DECIMAL(5,2));NULL非数値の VARCHAR から INT/INTEGER、SMALLINT、または TINYINT への変換では、
0が返されます:SELECT CAST('China' AS SMALLINT);+---------------------------+ | CAST('China' AS SMALLINT) | +---------------------------+ | 0 | +---------------------------+数値ではない JSON から INT/INTEGER、SMALLINT、または TINYINT への変換では、エラーが返されます:
SELECT CAST(CAST('[1,2,3]' AS JSON) AS SMALLINT);ERROR 1815 (HY000): [20034, 2021091814103119216818804803453190138] : Cannot cast json to smallint
例
SELECT CAST(2001012 AS FLOAT);+------------------------+
| CAST(2001012 AS FLOAT) |
+------------------------+
| 2001012.0|
+------------------------+CAST AS BIGINT
CAST(expr AS BIGINT)expr を BIGINT 型に変換します。
変換ルール
非数値の VARCHAR は
0を返します:SELECT CAST('a' AS BIGINT);+---------------------+ | CAST('a' AS BIGINT) | +---------------------+ | 0 | +---------------------+FLOAT、DOUBLE、または DECIMAL(M,D) の値は四捨五入されます:
SELECT CAST(1.23456789 AS BIGINT);+----------------------------+ | CAST(1.23456789 AS BIGINT) | +----------------------------+ | 1 | +----------------------------+数値ではない JSON は NULL を返します:
SELECT CAST(JSON'{}' AS BIGINT);NULL
例
-- DATE から BIGINT へ:日付を YYYYMMDD 形式の整数として返す
SELECT CAST(DATE '2021-09-18' AS BIGINT);+-----------------------------------+
| CAST(DATE '2021-09-18' AS BIGINT) |
+-----------------------------------+
| 20210918 |
+-----------------------------------+-- JSON の数値を BIGINT に変換
SELECT CAST(JSON '-1' AS BIGINT);+---------------------------+
| CAST(JSON '-1' AS BIGINT) |
+---------------------------+
| -1 |
+---------------------------+-- 式の結果を BIGINT に変換
SELECT CAST(FLOOR(4/5) AS BIGINT);+----------------------------+
| CAST(FLOOR(4/5) AS BIGINT) |
+----------------------------+
| 0 |
+----------------------------+CAST AS DOUBLE
CAST(expr AS DOUBLE)expr を DOUBLE 型に変換します。
変換ルール
非数値の VARCHAR は
0.0を返します:SELECT CAST('China' AS DOUBLE);+--------------------------+ | CAST('China' AS DOUBLE) | +--------------------------+ | 0.0 | +--------------------------+数値ではない JSON は NULL を返します:
SELECT CAST(JSON '{}' AS DOUBLE);NULL
例
-- DATE から DOUBLE へ:日付を浮動小数点数として返す
SELECT CAST(DATE '2021-09-17' AS DOUBLE);+------------------------------------+
| CAST(DATE '2021-09-17' AS DOUBLE) |
+------------------------------------+
| 2.0210917E7 |
+------------------------------------+CAST AS DATE|DATETIME|TIMESTAMP|TIME
CAST(expr AS DATE|DATETIME|TIMESTAMP|TIME)expr を DATE、DATETIME、TIMESTAMP、または TIME に変換します。
変換ルール
TIME 形式と一致しない VARCHAR または BIGINT は NULL を返します:
SELECT CAST('a' AS TIME);+-------------------+ | CAST('a' AS TIME) | +-------------------+ | NULL | +-------------------+時間コンポーネントがない場合は、デフォルトで
00:00:00になります:SELECT CAST(TIMESTAMP '2001-1-22' AS TIME);+-------------------------------------+ | CAST(TIMESTAMP '2001-1-22' AS TIME) | +-------------------------------------+ | 00:00:00 | +-------------------------------------+日付コンポーネントがない場合は、クエリ実行時のシステム日付がデフォルトになります:
SELECT CAST(TIME '00:00:00' AS DATE);+-------------------------------+ | CAST(TIME '00:00:00' AS DATE) | +-------------------------------+ | 2021-09-14 | +-------------------------------+
例
-- BIGINT から DATE へ
SELECT CAST(20010122000000 AS DATE);+------------------------------+
| CAST(20010122000000 AS DATE) |
+------------------------------+
| 2001-01-22 |
+------------------------------+CAST AS VARBINARY
CAST(expr AS VARBINARY)expr を VARBINARY 型に変換します。結果を文字列として読み取るには、別の CAST で VARCHAR に変換します。
例
SELECT CAST(CAST('CHINA' AS VARBINARY) AS VARCHAR);+---------------------------------------------+
| CAST(CAST('CHINA' AS VARBINARY) AS VARCHAR) |
+---------------------------------------------+
| CHINA |
+---------------------------------------------+CAST AS VARCHAR
CAST(expr AS VARCHAR)expr を VARCHAR 型に変換します。
VARBINARY から VARCHAR への変換には、AnalyticDB for MySQL V3.1.4 以降が必要です。
例
SELECT CAST(TIMESTAMP '2001-1-22 00:00:00' AS VARCHAR);+-------------------------------------------------+
| CAST(TIMESTAMP '2001-1-22 00:00:00' AS VARCHAR) |
+-------------------------------------------------+
| 2001-01-22 00:00:00 |
+-------------------------------------------------+CAST AS ARRAY
CAST(expr AS ARRAY<element_type>)expr を、要素が element_type の配列に変換します。
| パラメーター | 受け入れ可能な値 |
|---|---|
expr | VARCHAR、JSON |
element_type | TINYINT、SMALLINT、INT/INTEGER、FLOAT |
変換ルール
expr が ARRAY 形式に準拠していない場合、エラーが返されます:
SELECT CAST('{}}' AS ARRAY<float>);ERROR 1815 (HY000): [30013, 2021091815372119216818804803453204662] : Value cannot be cast to array(real)例
SELECT CAST(JSON '[1,2,3]' AS ARRAY<int>);+------------------------------------+
| CAST(JSON '[1,2,3]' AS ARRAY<int>) |
+------------------------------------+
| [1,2,3] |
+------------------------------------+CAST AS MAP
CAST(expr AS MAP<key_type, value_type>)VARCHAR 値を key_type から value_type へのマップに変換します。
| パラメーター | 受け入れ可能な値 |
|---|---|
expr | VARCHAR |
key_type | BOOLEAN、DECIMAL、DOUBLE、FLOAT、BIGINT、INT/INTEGER、SMALLINT、TINYINT、VARCHAR |
value_type | BOOLEAN、DECIMAL、DOUBLE、FLOAT、BIGINT、INT/INTEGER、SMALLINT、TINYINT、VARCHAR、ARRAY、JSON、MAP |
変換ルール
expr が MAP 形式に準拠していない場合、エラーが返されます:
SELECT CAST('[a,b,c]' AS MAP<varchar,varchar>);ERROR 1815 (HY000): [30013, 2021091815562519216818804803453207833] : Value cannot be cast to map(varchar,varchar)例
SELECT CAST('{"1":"a"}' AS MAP<varchar,varchar>);+-------------------------------------------+
| CAST('{"1":"a"}' AS MAP<varchar,varchar>) |
+-------------------------------------------+
| {"1":"a"} |
+-------------------------------------------+CAST AS JSON
CAST(expr AS JSON)expr を JSON 型に変換します。
変換ルール
expr が JSON 形式に準拠していない VARCHAR の場合、NULL が返されます:
SELECT CAST('{}}' AS JSON);NULL例
-- VARCHAR から JSON へ
SELECT CAST('{}' AS JSON);+--------------------+
| CAST('{}' AS JSON) |
+--------------------+
| {} |
+--------------------+-- BIGINT から JSON へ
SELECT CAST(BIGINT '0' AS JSON);+--------------------------+
| CAST(BIGINT '0' AS JSON) |
+--------------------------+
| 0 |
+--------------------------+