MaxCompute SQL では、異なるデータ型間の変換が可能です。この変換には、明示的な変換と暗黙的な変換があります。
明示的な変換
明示的な変換では、CAST 関数を使用して、あるデータ型の値を別のデータ型に変換します。次の表に、MaxCompute SQL でサポートされている明示的な変換を示します。この関数の詳細については、「CAST」をご参照ください。
変換元/変換先 | 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 |
この表では、Y は変換がサポートされていることを示し、N はサポートされていないことを示し、N/A は変換が不要であることを示します。サポートされていない明示的な変換を実行すると、エラーが返されます。
サンプルデータ
説明以下の例では、このサンプルデータを含む
userテーブルを使用します。create table if not exists user ( user_name string, user_id bigint, age bigint ); insert into user values ('zhangsan',111,20);例
SELECT CAST(user_id AS DOUBLE) AS new_id from user; 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>));
使用上の注意と制限事項
DOUBLE 型の値を BIGINT 型に変換すると、小数部が切り捨てられます。例:
CAST(1.6 AS BIGINT) = 1。DOUBLE フォーマットの STRING 型の値を BIGINT 型に変換すると、まず DOUBLE 型に変換された後、BIGINT 型に変換され、小数部が切り捨てられます。例:
CAST("1.6" AS BIGINT) = 1。BIGINT フォーマットの STRING 型の値を DOUBLE 型に変換できます。結果は小数点以下 1 桁になります。例:
CAST("1" AS DOUBLE) = 1.0。DATETIME 型への変換では、デフォルトフォーマット
yyyy-mm-dd hh:mi:ssが使用されます。直接的な明示的変換をサポートしていない一部のデータ型は、組み込み関数を使用して変換できます。たとえば、
TO_CHAR関数を使用して BOOLEAN 値を STRING 型に変換できます。詳細については、「TO_CHAR」をご参照ください。また、TO_DATE関数は STRING 値の DATETIME 型への変換もサポートしています。詳細については、「TO_DATE」をご参照ください。DECIMAL の値の範囲を超えると、
CAST STRING TO DECIMALでオーバーフローエラーやデータの切り捨てなどの問題が発生する可能性があります。DECIMAL 型を DOUBLE 型または FLOAT 型に明示的に変換すると、精度が低下する可能性があります。通貨計算などの高精度が求められるシナリオでは、DECIMAL 型の使用を推奨します。
MaxCompute は、複合データ型の変換をサポートしています。複合データ型の暗黙的または明示的な変換では、そのサブタイプも変換可能である必要があります。STRUCT を変換する場合、フィールド名が一致する必要はありませんが、フィールド数が同じで、対応するフィールドが暗黙的または明示的に変換可能である必要があります。例:
ARRAY<BIGINT>はARRAY<STRING>に暗黙的または明示的に変換できます。ARRAY<BIGINT>はARRAY<INT>に明示的に変換できますが、暗黙的には変換できません。ARRAY<BIGINT>はARRAY<DATETIME>に暗黙的にも明示的にも変換できません。STRUCT<a:BIGINT,b:INT>はSTRUCT<col1:STRING,col2:BIGINT>に暗黙的に変換できますが、STRUCT<a:STRING>には暗黙的にも明示的にも変換できません。
暗黙的な変換とその範囲
暗黙的な変換は、MaxCompute が実行時にコンテキストと変換ルールに基づいて自動的に実行するデータ型変換です。次の表に、MaxCompute がサポートする暗黙的な変換を示します。
変換元/変換先 | BOOLEAN | TINYINT | SMALLINT | INT | BIGINT | FLOAT |
BOOLEAN | N/A | N | N | N | N | N |
TINYINT | N | N/A | Y | Y | Y | Y |
SMALLINT | N | N | N/A | Y | Y | Y |
INT | N | N | N | N/A | Y | Y |
BIGINT | N | N | N | N | N/A | Y |
FLOAT | N | N | N | N | Y | N/A |
変換元/変換先 | DOUBLE | DECIMAL | STRING | VARCHAR | TIMESTAMP | BINARY |
DOUBLE | N/A | Y | Y | Y | N | N |
DECIMAL | N | N/A | Y | Y | N | N |
STRING | Y | Y | N/A | Y | N | N |
VARCHAR | Y | Y | Y | N/A | N | N |
TIMESTAMP | N | N | Y | Y | N/A | N |
BINARY | N | N | N | N | N | N/A |
これらの表では、Y は変換がサポートされていることを示し、N はサポートされていないことを示し、N/A は変換が不要であることを示します。サポートされていない暗黙的な変換や、実行時に失敗した変換の場合、MaxCompute はエラーを返します。
MaxCompute 2.0 では、DECIMAL 型と DATETIME 型の定数定義が導入されています。たとえば、100BD は値 100 の DECIMAL 定数、
2017-11-11 00:00:00は DATETIME 定数です。これらの定数は、VALUES 句やテーブルで直接使用できます。MaxCompute はコンテキストに基づいて暗黙的な変換を自動的に実行するため、データ型が一致しない場合は、CAST を使用して明示的に変換することを推奨します。
暗黙的な変換ルールは、特定の範囲内でのみ有効です。一部の範囲では、これらのルールのサブセットのみが適用される場合があります。
例
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;暗黙的な変換のルールは、演算子によって異なります。
関係演算子における暗黙的な変換
関係演算子には、
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE, and INが含まれます。LIKE, RLIKE, and INの暗黙的な変換ルールは、他の関係演算子とは異なり、個別に説明します。このセクションのルールは、これら 3 つの演算子には適用されません。関係演算で異なるデータ型が使用される場合、次のルールに従って暗黙的に変換されます。
変換元/変換先
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 つのデータ型が暗黙的に変換できない場合、関係演算は失敗し、エラーが返されます。
関係演算子の詳細については、「演算子」をご参照ください。
特殊な関係演算子における暗黙的な変換
特殊な関係演算子には、
LIKE, RLIKE, and INが含まれます。LIKE と RLIKE の構文は次のとおりです。
source LIKE pattern; source RLIKE pattern;説明LIKE と RLIKE の source パラメーターと pattern パラメーターは、STRING 型である必要があります。
他のデータ型は使用できず、この操作のために STRING 型に暗黙的に変換されることもありません。
IN の構文は次のとおりです。
key IN (value1, value2, …)説明IN 式では、値リスト内のすべての値が同じデータ型である必要があります。
キーと値を比較する際、型に BIGINT、DOUBLE、STRING が含まれる場合は、すべてを DOUBLE に変換することを推奨します。型に DATETIME と STRING が含まれる場合は、すべてを DATETIME に変換することを推奨します。他のデータ型変換は許可されていません。
算術演算子における暗黙的な変換
算術演算子には、
+, -, *, /, and %が含まれます。その暗黙的な変換ルールは次のとおりです。算術演算では、STRING、BIGINT、DOUBLE、DECIMAL 型のみ使用できます。
STRING 値は、演算の前に暗黙的に DOUBLE 型に変換されます。
BIGINT 型は、DOUBLE 型との計算で使用される場合、暗黙的に DOUBLE 型に変換されます。
DATETIME 型と BOOLEAN 型は算術演算では使用できません。
論理演算子における暗黙的な変換
論理演算子には、
and, or, and notが含まれます。その暗黙的な変換ルールは次のとおりです。論理演算では、BOOLEAN 値のみ使用できます。
他のデータ型は論理演算では使用できず、この目的のために暗黙的に変換されることもありません。
組み込み関数における暗黙的な変換
MaxCompute SQL は、任意の行の 1 つ以上の列に対して計算を実行し、さまざまなデータ型を返すための幅広い組み込み関数を提供します。その暗黙的な変換ルールは次のとおりです。
関数を呼び出すとき、入力パラメーターのデータ型がそのパラメーターに定義されている型と一致しない場合、パラメーターは要求される型に暗黙的に変換されます。
暗黙的な変換ルールは、MaxCompute SQL の各組み込み関数によって異なります。
CASE WHEN 式における暗黙的な変換
CASE WHEN 式の詳細については、「CASE WHEN式」をご参照ください。暗黙的な変換ルールは次のとおりです。
戻り値の型に BIGINT と DOUBLE のみが含まれる場合、すべて DOUBLE に変換されます。
いずれかの戻り値が STRING 型である可能性がある場合、すべての戻り値は STRING 型に変換されます。BOOLEAN などの型が変換できない場合は、エラーが返されます。
他のデータ型変換は許可されていません。
STRING 型と DATETIME 型の変換
MaxCompute は、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 |
単位の値が 1 桁の場合、先行ゼロを省略することはできません。たとえば、
2014-1-9 12:12:12は無効な DATETIME フォーマットであり、STRING 型から DATETIME 型に変換できません。2014-01-09 12:12:12のように記述する必要があります。STRING 型は、文字列が上記のフォーマットに一致する場合にのみ DATETIME 型に変換できます。たとえば、
CAST("2013-12-31 02:34:34" AS DATETIME)は、STRING 型の2013-12-31 02:34:34を DATETIME 型に変換します。同様に、DATETIME 値が STRING 型に変換される場合、デフォルトでyyyy-mm-dd hh:mi:ssのフォーマットになります。
MaxCompute が提供する TO_DATE 関数を使用すると、デフォルトの日付フォーマットに一致しない STRING 値を DATETIME 型に変換できます。詳細については、「TO_DATE」をご参照ください。