MaxCompute の CAST 関数は、式の結果をターゲットデータ型に変換します。このトピックでは、CAST 関数のコマンド形式、パラメーター、使用例について説明します。
コマンド形式
cast(<expr> as <type>)パラメーターの説明
expr:必須。ソースデータ。
type:必須。ターゲットデータ型。使用法は次のとおりです。
cast(double as bigint):DOUBLE 値を BIGINT 値に変換します。cast(string as bigint):文字列を BIGINT 値に変換します。文字列が整数を表す場合は、直接変換されます。文字列が浮動小数点数または指数表記の数値を表す場合は、最初に DOUBLE 型に変換され、その後 BIGINT 型に変換されます。cast(string as datetime)またはcast(datetime as string):デフォルトの日付形式yyyy-mm-dd hh:mi:ssが使用されます。基本データ型と JSON 型の間の変換。
CAST 関数は、JSON 型と基本データ型の間の変換もサポートしています。これには JSON、STRING、BIGINT、INT、TINYINT、SMALLINT、DOUBLE、FLOAT、BOOLEAN、および
SQL-TYPEが含まれます。以下はコマンド例です。cast(json as string):JSON 式を STRING 型に変換します。JSON 式を配列またはオブジェクトにすることはできません。cast(string as json):STRING 値を STRING 型の JSON 式に変換します。これはjson_parseおよびjson_formatとは異なります。json_parseは有効な JSON 文字列を JSON 値に変換し、JSON オブジェクトになることもあります。一方、cast(string as json)は任意の文字列を JSON 文字列に変換します。cast(null as json):NULL 値を JSON 型に変換します。cast(json 'null' as ...):json 'null'とnullは SQL のnullに変換されます。
戻り値の説明
ターゲットデータ型の値を返します。
setproject odps.function.strictmode=falseを実行した場合、関数は文字列の先頭から、数字以外の文字が出現するまでの数値を返します。setproject odps.function.strictmode=trueを実行した場合、エラーが返されます。DECIMAL 型に値を変換する場合:
odps.sql.decimal.tostring.trimzero=trueを設定した場合、小数点以下の末尾のゼロが削除されます。odps.sql.decimal.tostring.trimzero=falseを設定した場合、小数点以下の末尾のゼロが保持されます。重要odps.sql.decimal.tostring.trimzeroパラメーターは、テーブルから取得したデータと静的値の両方に影響します。
使用例
例 1:一般的な使用法。
-- 1 を返します。 select cast('1' as bigint);例 2:STRING 値を BOOLEAN 値に変換します。文字列が空の場合、
falseが返されます。それ以外の場合は、trueが返されます。文字列が空の場合。
select cast("" as boolean); -- 戻り値 +-------+ | _c0 | +-------+ | false | +-------+文字列が空でない場合。
select cast("false" as boolean); -- true を返します +------+ | _c0 | +------+ | true | +------+
例 3:文字列を日付に変換します。
-- 文字列を日付に変換します。 select cast("2022-12-20" as date); -- 戻り値 +------------+ | _c0 | +------------+ | 2022-12-20 | +------------+ -- 時刻部分を含む日付文字列を日付に変換します。 select cast("2022-12-20 00:01:01" as date); -- 戻り値 +------------+ | _c0 | +------------+ | NULL | +------------+ -- 値を正しく表示するには、次のパラメーターを設定します。 set odps.sql.executionengine.enable.string.to.date.full.format= true; select cast("2022-12-20 00:01:01" as date); -- 戻り値 +------------+ | _c0 | +------------+ | 2022-12-20 | +------------+説明デフォルトでは、
odps.sql.executionengine.enable.string.to.date.full.formatパラメーターはfalseです。時刻部分を含む日付文字列を変換するには、このパラメーターをtrueに設定する必要があります。例 4 (不正なコマンドの例): 不正な使用方法です。変換が失敗した場合、またはサポートされていない場合は、例外がスローされます。次のコマンドは不正な使用方法の例です。
select cast('abc' as bigint);例 5:
setproject odps.function.strictmode=falseを設定した場合の例。setproject odps.function.strictmode=false; select cast('123abc' as bigint); -- 戻り値 +-----+ | _c0 | +-----+ | 123 | +-----+例 6:
setproject odps.function.strictmode=trueを設定した場合の例。setproject odps.function.strictmode=true; select cast('123abc' as bigint); -- 戻り値 FAILED:ODPS-0130071:[0,0]Semanticanalysisexception-physicalplangenerationfailed:java.lang.NumberFormatException:ODPS-0123091:Illegaltypecast-Infunctioncast,value'123abc'cannotbecastedfromStringtoBigint.例 7:
odps.sql.decimal.tostring.trimzeroを設定した場合の例。-- テーブルを作成します。 create table mf_dot (dcm1 decimal(38,18), dcm2 decimal(38,18)); -- データを挿入します。 insert into table mf_dot values (12.45500BD,12.3400BD); -- フラグが true の場合、または設定されていない場合。 set odps.sql.decimal.tostring.trimzero=true; -- 小数点以下の末尾のゼロを削除します。 select cast(round(dcm1,3) as string),cast(round(dcm2,3) as string) from mf_dot; -- 戻り値 +--------+-------+ | _c0 | _c1 | +--------+-------+ | 12.455 | 12.34 | +--------+-------+ -- フラグが false の場合。 set odps.sql.decimal.tostring.trimzero=false; -- 小数点以下の末尾のゼロを保持します。 select cast(round(dcm1,3) as string),cast(round(dcm2,3) as string) from mf_dot; -- 戻り値 +--------+--------+ | _c0 | _c1 | +--------+--------+ | 12.455 | 12.340 | +--------+--------+ -- このパラメーターは静的値にも適用されます。 set odps.sql.decimal.tostring.trimzero=false; select cast(round(12345.120BD,3) as string); -- 戻り値: +-----------+ | _c0 | +-----------+ | 12345.120 | +-----------+
例 8:STRING 型と JSON 型の間の変換
-- JSON を文字列に変換します。 select cast(json '123' as string); -- 戻り値: +-----+ | _c0 | +-----+ | 123 | +-----+ -- JSON を文字列に変換します。 select cast(json '"abc"' as string); -- 戻り値: +-----+ | _c0 | +-----+ | abc | +-----+ -- JSON を文字列に変換します。 select cast(json 'true' as string); -- 戻り値: +------+ | _c0 | +------+ | TRUE | +------+ -- JSON を文字列に変換します。 select cast(json 'null' as string); -- 戻り値: +------+ | _c0 | +------+ | NULL | +------+ -- 文字列を JSON に変換します。 select cast('{"a":2}' as json); -- 戻り値: +-----------+ | _c0 | +-----------+ | "{\"a\":2}" | +-----------+ -- JSON を文字列に変換する誤った例。配列型またはオブジェクト型の JSON 式を文字列に変換することはサポートされていません。 select cast(json '{"a":2}' as string); -- エラーが返されます: FAILED: ODPS-0123091:Illegal type cast - Unsupported cast from json array/object to string例 9:数値型と JSON 型の間の変換
-- JSON を BIGINT に変換します。 select cast(json '123' as bigint); -- 戻り値: +-----+ | _c0 | +-----+ | 123 | +-----+ -- JSON を FLOAT に変換します。 select cast(json '"1.23"' as float); -- 戻り値: +------+ | _c0 | +------+ | 1.23 | +------+ -- JSON を DOUBLE に変換します。 select cast(json '1.23' as double); -- 戻り値: +------+ | _c0 | +------+ | 1.23 | +------+ -- INT を JSON に変換します。 select cast(123 as json); -- 戻り値: +-----+ | _c0 | +-----+ | 123 | +-----+ -- FLOAT を JSON に変換します。 select cast(1.23 as json); -- 戻り値: +------+ | _c0 | +------+ | 1.23 | +------+例 10:BOOLEAN 型と JSON 型の間の変換
-- BOOLEAN を JSON に変換します。 select cast(true as json); -- 戻り値: +------+ | _c0 | +------+ | true | +------+ -- JSON を BOOLEAN に変換します。 select cast(json 'false' as boolean); -- 戻り値: +-------+ | _c0 | +-------+ | false | +-------+ -- JSON を BOOLEAN に変換します。 select cast(json '"abc"' as boolean); -- 戻り値: +------+ | _c0 | +------+ | true | +------+ -- 配列またはオブジェクトを BOOLEAN に変換することはできません。 select cast(json '[1,2]' as boolean); -- エラーが返されます: Unsupported cast from json array/object to boolean例 11:NULL 型と JSON 型の間の変換
-- NULL を JSON に変換します。 select json_type(cast(null as json)); -- 戻り値: +------+ | _c0 | +------+ | NULL | +------+
関連する関数
CAST 関数は複雑な型関数です。 ARRAY、MAP、STRUCT、JSON などの複雑なデータ型を処理する関数については、「複雑な型関数」をご参照ください。
CAST 関数は、別のタイプの関数としても分類されます。他のビジネスシナリオの関数に関する詳細については、「その他の関数」をご参照ください。