MaxCompute SQLを使用すると、データ型を変換できます。 明示的な変換と暗黙的な変換がサポートされています。
明示的変換
明示的な変換では、CAST関数を使用して値のデータ型を変換します。 次の表に、MaxCompute SQLでサポートされている明示的な変換のルールを示します。 CAST機能の詳細については、「CAST」をご参照ください。
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 |
フロート | Y | Y | Y | N | Y | Y | 非該当 |
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タイプの1.6をBIGINTタイプの1に変換できます。DOUBLE型の形式を満たすSTRING型の値をBIGINT型に変換すると、STRING型からDOUBLE型に変換された後、BIGINT型に変換されます。 変換中に、小数点の後の数字は削除されます。 たとえば、
CAST("1.6" AS BIGINT) = 1
を実行して、STRING型の1.6をBIGINT型の1に変換できます。BIGINT型の形式を満たすSTRING型の値をDOUBLE型に変換すると、小数点以下1桁が保持されます。 たとえば、
CAST("1" AS DOUBLE) = 1.0
を実行して、STRING型の1をDOUBLE型の1.0に変換できます。DATETIME型を含む変換では、デフォルトの形式
yyyy-mm-dd hh:mi:ss
が使用されます。特定のデータ型は明示的に変換できませんが、SQL組み込み関数を使用して変換できます。 たとえば、
TO_CHAR
関数を使用してBOOLEAN型をSTRING型に変換できます。 詳細については、「TO_CHAR」をご参照ください。TO_DATE
関数を使用して、STRING型をDATETIME型に変換することもできます。 詳細については、「TO_DATE」をご参照ください。値がDECIMAL型の値の範囲を超えると、
CAST STRING TO DECIMAL
の実行中にエラーが発生する可能性があります。 例えば、最上位ビットのオーバーフローまたは最下位ビットの除去が発生し得る。DECIMALタイプからDOUBLEまたはFLOATタイプへの変換は、精度の損失をもたらす。 請求額やプレミアムレートを計算する場合など、高精度が必要なシナリオでは、DECIMALタイプを保持することをお勧めします。
MaxComputeでは、複雑なデータ型を変換できます。 複合データ型間の暗黙的な変換は、サブタイプが暗黙的な変換をサポートする場合にのみ実装できます。 複雑なデータ型間の明示的な変換は、サブタイプが明示的な変換をサポートしている場合にのみ実装できます。 STRUCT型を変換すると、フィールド名に矛盾が生じる可能性がありますが、フィールドの数は一貫している必要があり、これらのフィールドは暗黙的または明示的な変換をサポートする必要があります。 例:
MaxComputeは、
BIGINT
型の値をSTRING
型の値に暗黙的または明示的に変換できます。MaxComputeは、
BIGINT
型の値をINT
型の値に明示的に変換できます。 暗黙的な変換はサポートされていません。MaxComputeは、
BIGINT
型の値をDATETIME
型の値に暗黙的または明示的に変換できません。MaxComputeは、
STRUCT<a:BIGINT,b:INT>
の値をSTRUCT<col1:STRING,col2:BIGINT>
の値に暗黙的に変換できます。 MaxComputeは、STRUCT<a:BIGINT,b:INT> の値をSTRUCT<a:STRING>
の値に暗黙的または明示的に変換できません。
暗黙的な変換とその適用範囲
暗黙的な変換により、MaxComputeはコンテキストと定義済みのルールに基づいてデータ型を自動的に変換できます。 次の表に、MaxComputeでサポートされている暗黙的な変換のルールを示します。
From/To | BOOLEAN | TINYINT | SMALLINT | INT | BIGINT | FLOAT |
BOOLEAN | 非該当 | N | N | N | N | N |
TINYINT | N | 非該当 | Y | Y | Y | Y |
SMALLINT | N | N | 非該当 | Y | Y | Y |
INT | N | N | Y | 非該当 | Y | Y |
BIGINT | N | N | N | N | 非該当 | Y |
FLOAT | N | N | N | N | Y | 非該当 |
From/To | DOUBLE | DECIMAL | STRING | VARCHAR | TIMESTAMP | BINARY |
DOUBLE | 非該当 | Y | Y | Y | N | N |
DECIMAL | N | 非該当 | Y | Y | N | N |
STRING | Y | Y | 非該当 | Y | N | N |
VARCHAR | Y | Y | Y | 非該当 | 非該当 | 非該当 |
TIMESTAMP | N | N | Y | Y | 非該当 | N |
BINARY | N | N | N | N | N | 非該当 |
Yは、変換がサポートされていることを示します。 Nは、変換がサポートされていないことを示します。 N/Aは、変換が不要であることを示す。 サポートされていない暗黙的な変換が実行された場合、または変換が失敗した場合、エラーが返されます。
MaxCompute V2.0では、DECIMAL型とDATETIME型の定数を定義するメソッドが導入されています。 たとえば、100BDはDECIMALタイプの値100を示します。
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、およびIN
が含まれます。LIKE、RLIKE、およびIN
を使用するルールは、他のリレーショナル演算子を使用するルールとは異なります。 このセクションで説明するルールは、3つの演算子には適用されません。次の表に、リレーショナル操作に異なる型のデータを使用する場合の暗黙的な変換の規則を示します。
From/To
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のソースおよびパターンパラメータは、STRING型でなければなりません。
他の型は、操作に関与することも、暗黙的にSTRING型に変換することもできません。
INの構文
key IN (value1, value2, ...)
説明inの横にある値リストのデータ型は一貫している必要があります。
値のデータ型がBIGINT、DOUBLE、およびSTRINGの場合、BIGINT型およびSTRING型の値をDOUBLE型に変換します。 値のデータ型にDATETIMEとSTRINGが含まれる場合、STRING型の値をDATETIME型に変換します。 他のデータ型間の変換は許可されません。
算術演算子による暗黙の変換
算術演算子には、
+ 、-、* 、/、および %
が含まれます。 これらの演算子を使用した暗黙の変換には、次の規則が適用されます。算術演算には、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への変換などの変換が失敗すると、エラーが返されます。
他のデータ型間の変換は許可されません。
STRING型とDATETIME型の変換
MaxComputeは、STRING型とDATETIME型間の変換をサポートしています。 変換中にyyyy-mm-dd hh:mi:ss
形式が使用されます。
時間単位 | 文字列 (大文字と小文字を区別しない) | 有効値 |
年 | yyyy | 0001 - 9999 |
1 か月 | mm | 01 - 12 |
1 日 | dd | 01 - 28 | 29 | 30 | 31 |
1 時間 | hh | 00 - 23 |
分 | mi | 00 - 59 |
秒 | ss | 00 - 59 |
各時間単位の値の範囲の最初の桁が0の場合、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
形式で表されます。
MaxComputeには、DATETIME型の形式を満たさないSTRING型をDATETIME型に変換するTO_DATE関数が用意されています。 詳細については、「TO_DATE」をご参照ください。