MaxCompute SQLでは、データ型の変換が可能です。 明示的型変換と暗黙的型変換の 2 通りの変換方法があります。
明示的変換
明示的な変換では、CAST を使用して値の型を別の型に変換します。 次の表に、MaxCompute SQL で明示的に変換できる型を示します。
From/To | BIGINT | DOUBLE | STRING | DATETIME | BOOLEAN | DECIMAL | FLOAT |
---|---|---|---|---|---|---|---|
BIGINT | – | Y | Y | N | Y | Y | Y |
DOUBLE | Y | – | Y | N | Y | Y | Y |
STRING | Y | Y | – | Y | Y | Y | Y |
DATETIME | N | N | Y | – | N | N | N |
BOOLEAN | Y | Y | Y | N | – | Y | Y |
DECIMAL | Y | Y | Y | N | Y | – | Y |
FLOAT | Y | Y | Y | N | Y | Y | - |
Y: 変換可能 N: 変換不可 -: 変換不要
例:
select cast(user_id as double) as new_id from user;
select cast('2015-10-01 00:00:00' as datetime) as new_date from user;
注
- 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 を使用します。 詳細については、「STRING 型と DATETIME 型の間の変換」をご参照ください。
- 一部の型は明示的には変換できませんが、組み込み SQL 関数を使用して変換できます。 たとえば、to_char 関数を使用すると、BOOLEAN 型の値を STRING 型に変換できます。 詳細については、「TO_CHAR」をご参照ください。 to_date 関数を使用すると、STRING 型の値を DATETIME 型に変換できます。 詳細については、「TO_DATE」をご参照ください。
- 詳細については、「CAST」をご参照ください。
- DECIMAL 値が値の範囲を超えると、CAST STRING TO DECIMAL で MSB オーバーフローエラーまたは LSB オーバーフロー切り捨てが発生することがあります。
暗黙的変換と範囲
MaxCompute では、コンテキスト環境と変換ルールに基づいて、暗黙的な型変換が自動的に実行されます。 次の表に、MaxCompute で暗黙的に変換できる型を示します。
boolean | tinyint | smallint | int | bigint | float | double | Decimal | string | varchar | timestamp | binary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
boolean to | Y | N | N | N | N | N | N | N | N | N | N | N |
tinyint to | N | Y | Y | Y | Y | Y | Y | Y | Y | Y | N | N |
smallint to | N | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N |
int to | N | N | Y | Y | Y | Y | Y | Y | Y | Y | N | – |
bigint to | N | N | N | N | Y | Y | Y | Y | Y | Y | N | N |
float to | N | N | N | N | Y | Y | Y | Y | Y | Y | N | – |
double to | N | N | N | N | N | N | Y | Y | Y | Y | N | N |
decimal to | N | N | N | N | N | N | N | Y | Y | Y | N | N |
string to | N | N | N | N | N | N | Y | Y | Y | Y | N | N |
varchar to | N | N | N | N | Y | Y | Y | Y | N | N | – | – |
timestamp to | N | N | N | N | N | N | N | N | Y | Y | Y | N |
binary to | N | N | N | N | N | N | N | N | N | N | N | Y |
Y: 変換可能 N: 変換不可
注
- DECIMAL 型および DATETIME 定数定義モードが MaxCompute2.0 に追加されました。 100BD は値が 100 である DECIMAL を示します。
日時
2017-11-11 00:00:00
は、DATETIME 型の定数を示します。定数定義は、values 句とテーブルで直接使用できるので便利です。 - 以前のバージョンの MaxCompute では、DOUBLE 型の値を暗黙的に BIGINT 型に変換できます。 何らかの理由により、このような変換はデータの損失につながる可能性があり、共通のデータベースシステムでは許可されていません。
一般的な使用方法
select user_id+age+'12345',
concat(user_name,user_id,age)
from user;
注
- サポート対象外の型の暗黙的な変換を行うと、例外が発生することがあります。
- 実行中に変換に失敗すると、例外が発生します。
- MaxCompute では、コンテキスト環境に基づいて暗黙の型変換が自動的に実行されます。 型が一致しない場合は、CAST を使用して明示的な変換を実行することを推奨します。
- 暗黙の型変換ルールは、特定の範囲のスコープに適用できます。 一部のスコープでは、一部のルールのみが有効です。 詳細については、「暗黙的な変換のスコープ」をご参照ください。
- 関係演算子に関する暗黙的な変換
関係演算子は、等しい (=)、等しくない (<>)、より小さい (<)、以下 (<=)、より大きい (>)、以上 (>=)、IS NULL、IS NOT NULL、LIKE、RLIKE、および IN です。 LIKE、RLIKE、および IN の暗黙的な変換ルールの特徴ついて個別に説明します。 以下の説明には、これら 3 つの特殊な演算子は含まれていません。
次の表では、さまざまな型のデータが関係演算に使用されている場合の暗黙の型変換ルールについて説明します。変換前/変換後 Bigint Double String Datetime Boolean Decimal Bigint – Double Double N N Decimal Double Double – Double N N Decimal String Double Double – Datetime N Decimal Datetime N N Datetime – N N Boolean N N N N – N Decimal Decimal Decimal Decimal N N - 注- 2 つの型を暗黙的に変換できない場合、例外が発生して関係演算は中断されます。
- 関係演算子に関する詳細は、「関係演算子」をご参照ください。
- 特殊な関係演算子での暗黙的な型変換特殊な関係演算子には、LIKE、RLIKE、および IN があります。
- LIKE と RLIKE の使い方は次のとおりです。
source like pattern; source rlike pattern;
暗黙的な変換での LIKE および RLIKE の注意事項を次に示します。- LIKE と RLIKE の source パラメーターと pattern パラメーターは、STRING 型である必要があります。
- 他の型を演算で使用することも、暗黙的に STRING 型に変換することもできません。
-
IN の使い方は次のとおりです。
key in (value1, value2, …)
IN の暗黙の型変換ルール- 値列のデータ型は一貫している必要があります。
- キーと値を比較する場合、BIGINT、DOUBLE、および STRING 型の比較では、それらは DOUBLE 型に変換されます。 DATETIME 型と STRING 型を比較する場合は、DATETIME 型に変換されます。 他の型間の変換は行えません。
- LIKE と RLIKE の使い方は次のとおりです。
- 算術演算子での暗黙的な変換算術演算子には、足し算 (+)、引き算 (-)、掛け算 (*)、割り算 (/)、剰余演算 (%)、単項プラス (+) および単項マイナス (-) があります。 算術演算子の暗黙的な型変換ルールは、次のとおりです。
- 演算には、STRING、BIGINT、DOUBLE、および DECIMAL 型のみ使用できます。
- STRING 型は、演算の前に暗黙的に DOUBLE 型に変換されます。
- BIGINT と DOUBLE 型が演算に含まれている場合、BIGINT 型は暗黙的に DOUBLE 型に変換されます。
- DATETIME 型と BOOLEAN 型は、算術演算では使用できません。
- 論理演算子での暗黙的な変換論理演算子には、AND、OR、NOT があります。 論理演算子の暗黙的な変換ルールは、次のとおりです。
- 論理演算では、BOOLEAN 型のみを使用できます。
- 他の型を論理演算で使用することはできず、暗黙的に他の型に変換することもできません。
組み込み関数の暗黙的な変換
MaxCompute SQL は、多数のシステム関数を実装しています。 任意の行の 1 つまたは複数の列を計算し、任意の型のデータを出力できます。 組み込み関数の暗黙的な変換ルールは、次のとおりです。
- 関数を呼び出すには、入力パラメーターのデータ型が関数で定義されているデータ型と異なる場合、入力パラメーターのデータ型が関数で定義されたデータ型に変換されます。
- MaxCompute SQL の各種組み込み関数のパラメーターには、暗黙的な変換に関するさまざまな要件があります。 詳細については、「組み込み関数」をご参照ください。
CASE WHEN での暗黙的な変換
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 |
注
- 各単位の値で、上の桁が 0 の場合、省略できません。 たとえば、
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 です。
たとえば、次の変換では例外が発生します。
cast("2013/12/31 02/34/34" as datetime)
cast("20131231023434" as datetime)
cast("2013-12-31 2:34:34" as datetime)
dd のしきい値は、1 か月の日数によって異なります。 値がその月の実際の日数を超えた場合、例外が発生して変換は中断されます。
例:
cast("2013-02-29 12:12:12" as datetime) -- エラーが返されます。2013 年 2 月 29 日は存在しません。
cast("2013-11-31 12:12:12" as datetime) -- エラーが返されます。2013 年 11 月 31 日は存在しません。
MaxCompute には、DATETIME 形式を満たさない STRING 型を DATETIME 型に変換する TO_DATE 関数が実装されています。 詳細については、「TO_DATE」をご参照ください。