MaxCompute SQL は、CAST 関数を使用した明示的な型変換と、コンテキストに基づいて MaxCompute が自動的に型を変換する暗黙の型変換という 2 種類の型変換をサポートしています。
明示的な型変換
CAST 関数は、あるデータの型の値を別のデータの型に変換します。構文の詳細については、「CAST」をご参照ください。
次の表は、サポートされている明示的な型変換を示しています。Y = サポート対象、N = サポート対象外、N/A = 該当なしです。
| From\To | BIGINT | DOUBLE | STRING | DATETIME | BOOLEAN | DECIMAL | FLOAT |
|---|---|---|---|---|---|---|---|
| BIGINT | N/A | Y | Y | N | Y | Y | Y |
| DOUBLE | Y | N/A | Y | N | Y | Y | Y |
| STRING | Y | Y | N/A | Y | Y | Y | Y |
| DATETIME | N | N | Y | N/A | N | N | N |
| BOOLEAN | Y | Y | Y | N | N/A | Y | Y |
| DECIMAL | Y | Y | Y | N | Y | N/A | Y |
| FLOAT | Y | Y | Y | N | Y | Y | N/A |
サポートされていない変換を実行しようとすると、エラーが返されます。
変換動作と制限事項
数値型の変換
| 変換 | 動作 | 例 |
|---|---|---|
| DOUBLE → BIGINT | 小数点以下が四捨五入されず切り捨てられます | CAST(1.6 AS BIGINT) → 1 |
| STRING (DOUBLE 形式) → BIGINT | STRING → DOUBLE → BIGINT の順で変換され、小数点以下が切り捨てられます | CAST('1.6' AS BIGINT) → 1 |
| STRING (BIGINT 形式) → DOUBLE | 小数点以下 1 桁が付加されます | CAST('1' AS DOUBLE) → 1.0 |
DATETIME 型の変換
DATETIME を含む変換では、フォーマット yyyy-mm-dd hh:mi:ss を使用します。先頭のゼロが必要です。2014-01-09 12:12:12 は有効ですが、2014-1-9 12:12:12 は無効です。
DECIMAL 型の変換
STRING を DECIMAL にキャストする際、値が DECIMAL の範囲を超える場合(たとえば最上位桁がオーバーフローする場合や最下位桁が切り捨てられる場合)はエラーが返されます。
DECIMAL を DOUBLE または FLOAT にキャストすると精度が失われます。請求金額や保険料率などの金融計算では、値を DECIMAL のまま保持してください。
CAST でサポートされていない変換
一部の型ペアは CAST で変換できませんが、ビルトイン関数で処理できます。
| 変換 | 代替関数 |
|---|---|
| BOOLEAN → STRING | TO_CHAR |
| STRING (非標準フォーマット) → DATETIME | TO_DATE |
複合型の変換
複合型(ARRAY、STRUCT)間の変換は、その要素型またはフィールドの変換ルールに従います。
複合型間の暗黙の変換は、サブタイプが暗黙の変換をサポートしている場合にのみ可能です。
複合型間の明示的な変換は、サブタイプが明示的な変換をサポートしている場合にのみ可能です。
STRUCT 型の場合、フィールド名は異なっても構いませんが、フィールド数は一致し、各フィールドペアが必要な変換をサポートしている必要があります。
| 変換 | 暗黙 | 明示的 |
|---|---|---|
| BIGINT → STRING | Y | Y |
| BIGINT → INT | N | Y |
| BIGINT → DATETIME | N | N |
STRUCT<a:BIGINT, b:INT> → STRUCT<col1:STRING, col2:BIGINT> | Y | Y |
STRUCT<a:BIGINT, b:INT> → STRUCT<col1:STRING> (フィールド数不一致) | N | N |
例
以下の例では user テーブルを使用します。テーブルを作成してサンプルデータを挿入するには、次のコマンドを実行します。
CREATE TABLE IF NOT EXISTS user (
user_name STRING,
user_id BIGINT,
age BIGINT
);
INSERT INTO user VALUES ('zhangsan', 111, 20);-- BIGINT 列を DOUBLE にキャスト
SELECT CAST(user_id AS DOUBLE) AS new_id FROM user;
-- 文字列リテラルを DATETIME にキャスト
SELECT CAST('2015-10-01 00:00:00' AS DATETIME) AS new_date;
-- 整数配列を文字列配列にキャスト
SELECT CAST(ARRAY(1, 2, 3) AS ARRAY<STRING>);
-- 文字列配列をカンマ区切りの文字列に結合
SELECT CONCAT_WS(',', CAST(ARRAY(1, 2) AS ARRAY<STRING>));暗黙の型変換
MaxCompute は、コンテキストに基づいてデータの型を自動的に変換します。次の表は、サポートされている暗黙の型変換を示しています。Y = サポート対象、N = サポート対象外、N/A = 該当なしです。
整数型および浮動小数点型
| From\To | BOOLEAN | TINYINT | SMALLINT | INT | BIGINT | FLOAT |
|---|---|---|---|---|---|---|
| BOOLEAN | Y | N | N | N | N | N |
| TINYINT | N | Y | Y | Y | Y | Y |
| SMALLINT | N | N | Y | Y | Y | Y |
| INT | N | N | Y | Y | Y | Y |
| BIGINT | N | N | N | N | Y | Y |
| FLOAT | N | N | N | N | Y | Y |
10 進数型および文字列型
| From\To | DOUBLE | DECIMAL | STRING | VARCHAR | TIMESTAMP | BINARY |
|---|---|---|---|---|---|---|
| DOUBLE | Y | Y | Y | Y | N | N |
| DECIMAL | N | Y | Y | Y | N | N |
| STRING | Y | Y | Y | Y | N | N |
| VARCHAR | Y | Y | N | N | N/A | N/A |
| TIMESTAMP | N | N | Y | Y | Y | N |
| BINARY | N | N | N | N | N | Y |
サポートされていない暗黙の型変換を実行しようとしたり、ランタイムで変換に失敗したりすると、エラーが返されます。
MaxCompute V2.0 では、DECIMAL および DATETIME の型付き定数が導入されました。たとえば、
100BDは値 100 の DECIMAL 定数であり、2017-11-11 00:00:00は DATETIME 定数です。これらの定数は、VALUES 句やテーブルで直接使用できます。式内で型が一致しない場合は、暗黙の変換に依存せずに
CASTを使用して明示的に変換してください。暗黙の変換ルールは特定のコンテキストに適用されます。状況によっては、ルールの一部のみが有効になることがあります。
例
SELECT user_id + age + '12345', CONCAT(user_name, user_id, age) FROM user;このクエリでは、'12345' は算術式のために DOUBLE に暗黙的に変換され、user_id および age は CONCAT のために STRING に暗黙的に変換されます。
関係演算子による暗黙の変換
関係演算子には、=、<>、<、<=、>、>=、IS NULL、および IS NOT NULL が含まれます。次の表は、MaxCompute が関係比較における型の不一致をどのように解決するかを示しています。セルの値は、両方のオペランドが変換される型です。
| From\To | BIGINT | DOUBLE | STRING | DATETIME | BOOLEAN | DECIMAL |
|---|---|---|---|---|---|---|
| BIGINT | N/A | DOUBLE | DOUBLE | N | N | DECIMAL |
| DOUBLE | DOUBLE | N/A | DOUBLE | N | N | DECIMAL |
| STRING | DOUBLE | DOUBLE | N/A | DATETIME | N | DECIMAL |
| DATETIME | N | N | DATETIME | N/A | N | N |
| BOOLEAN | N | N | N | N | N/A | N |
| DECIMAL | DECIMAL | DECIMAL | DECIMAL | N | N | N/A |
2 つのオペランドが暗黙の変換をサポートしていない場合、比較はエラーで失敗します。関係演算子の詳細については、「Operators」をご参照ください。
LIKE、RLIKE、IN による暗黙の変換
LIKE、RLIKE、および IN は、他の関係演算子とは異なるルールに従います。
LIKE および RLIKE
source LIKE pattern;
source RLIKE pattern;source および pattern はどちらも STRING である必要があります。他の型は使用できず、STRING に暗黙的に変換されることもありません。
IN
key IN (value1, value2, ...)リスト内のすべての値は同じ型である必要があります。リストに複数の型が混在している場合、MaxCompute は次の変換を適用します。
リストに BIGINT、DOUBLE、および STRING 値が含まれている場合、BIGINT および STRING は DOUBLE に変換されます。
リストに DATETIME および STRING 値が含まれている場合、STRING は DATETIME に変換されます。
その他の型の組み合わせはサポートされていません。
算術演算子による暗黙の変換
算術演算子には、+、-、*、/、および % が含まれます。
算術式では、BIGINT、DOUBLE、DECIMAL、および STRING 値のみを使用できます。
STRING は操作前に DOUBLE に暗黙的に変換されます。
BIGINT および DOUBLE が同じ式に含まれる場合、BIGINT は DOUBLE に変換されます。
DATETIME および BOOLEAN は算術式で使用できません。
論理演算子による暗黙の変換
論理演算子には、AND、OR、および NOT が含まれます。論理式では BOOLEAN 値のみを使用できます。他の型は暗黙的に変換されません。
ビルトイン関数による暗黙の変換
ビルトイン関数が、期待されるパラメーター型と異なる型の引数を受け取った場合、MaxCompute はその引数を期待される型に暗黙的に変換します。各ビルトイン関数は、独自の暗黙の変換要件を定義しています。
CASE WHEN による暗黙の変換
CASE WHEN の詳細については、「CASE WHEN expression」をご参照ください。
THEN および ELSE ブランチが異なる型を返す場合、MaxCompute は次のように解決します。
BIGINT および DOUBLE → すべてのブランチが DOUBLE に変換されます。
いずれかのブランチが STRING を返す → すべてのブランチが STRING に変換されます。ブランチが変換できない場合(たとえば BOOLEAN から STRING)、エラーが返されます。
その他の型の組み合わせはサポートされていません。
STRING と DATETIME 間の変換
STRING と DATETIME 間の変換では、フォーマット yyyy-mm-dd hh:mi:ss を使用します。各コンポーネントの有効値は次のとおりです。
| 項目 | 形式 | 有効値 |
|---|---|---|
| 年 | yyyy | 0001–9999 |
| 月 | mm | 01–12 |
| 日 | dd | 01–28/29/30/31 |
| 時 | hh | 00–23 |
| 分 | mi | 00–59 |
| 秒 | ss | 00–59 |
先頭のゼロが必要です。たとえば、2014-1-9 12:12:12 は無効です。2014-01-09 12:12:12 と記述してください。
-- 有効:文字列を DATETIME にキャスト
SELECT CAST('2013-12-31 02:34:34' AS DATETIME);
-- DATETIME を STRING に変換すると、自動的に yyyy-mm-dd hh:mi:ss フォーマットになりますこのフォーマットに従っていない STRING を変換するには、TO_DATE を使用してください。
次の変換試行は失敗し、例外が発生します。
CAST("2013/12/31 02/34/34" AS DATETIME)
CAST("20131231023434" AS DATETIME)
CAST("2013-12-31 2:34:34" AS DATETIME)日コンポーネントの最大値は、指定された月の実際の日数に依存します。その月の日数を超える値を指定すると、例外が発生します。
CAST("2013-02-29 12:12:12" AS DATETIME) -- 例外が返されます。2013 年 2 月には 29 日がありません。
CAST("2013-11-31 12:12:12" AS DATETIME) -- 例外が返されます。2013 年 11 月には 31 日がありません。