MaxCompute の CAST 関数は、データ型の変換を行う関数です。この関数は、expr パラメーターで指定されたデータソースのデータ型を、type パラメーターで指定されたデータ型に変換します。このトピックでは、CAST 関数の構文とパラメーターについて説明します。また、CAST 関数の使用方法の例も示します。
構文
cast(<expr> as <type>)パラメーター
expr: 必須。データ型を変換するデータソース。
type: 必須。変換先のデータ型。使用方法:
cast(double as bigint): DOUBLE 型の値を BIGINT 型に変換します。cast(string as bigint): STRING 型の値を BIGINT 型に変換します。文字列が INTEGER 形式で表現された数値で構成されている場合、文字列は BIGINT 型に変換されます。文字列が FLOAT または EXPONENTIAL 形式で表現された数値で構成されている場合、文字列は DOUBLE 型に変換された後、BIGINT 型に変換されます。デフォルトの日付形式
yyyy-mm-dd hh:mi:ssは、cast(string as datetime)およびcast(datetime as string)に使用されます。基本データ型と JSON 型間の変換:
CAST 関数は、JSON 型と次の基本データ型の間でも値を変換できます。
STRING, BIGINT, INT, TINYINT, SMALLINT, DOUBLE, FLOAT, BOOLEAN, and SQL-TYPE。使用方法:cast(json as string): JSON 式を STRING 型の値に変換します。JSON 式は ARRAY 型または OBJECT 型にはできません。cast(string as json): STRING 型の値を JSON 式に変換します。JSON 式は STRING 型です。CAST 関数は JSON_PARSE 関数および JSON_FORMAT 関数とは異なることに注意してください。JSON_PARSE 関数を使用すると、有効な JSON 文字列のみを JSON データ(JSON オブジェクトの場合があります)に変換できます。CAST 関数を使用すると、文字列を STRING 型の値を含む JSON 文字列に変換できます。cast(null as json): null 値を JSON の 'null' 値に変換します。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 に設定すると、末尾の 0 が削除された 10 進数が返されます。odps.sql.decimal.tostring.trimzeroを false に設定すると、末尾に 0 がある 10 進数が返されます。重要odps.sql.decimal.tostring.trimzeroパラメーターは、テーブルからデータが読み取られる場合にのみ有効になります。このパラメーターは、静的な値には影響しません。
例
例 1: 一般的な使用方法。サンプルステートメント:
-- 戻り値は 1 です。 select cast('1' as bigint);例 2: STRING 型の値を BOOLEAN 型に変換します。STRING 型の値が空の文字列の場合、
falseが返されます。それ以外の場合、trueが返されます。サンプルステートメント:STRING 型の値は空の文字列です。
select cast("" as boolean); -- 戻り値は false です。 +------+ | _c0 | +------+ | false | +------+STRING 型の値は空でない文字列です。
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が指定されています。setprojectodps.function.strictmode=false; select cast('123abc'as bigint); -- 次の結果が返されます。 +------------+ |_c0| +------------+ |123| +------------+例 6:
setproject odps.function.strictmode=trueが指定されています。setprojectodps.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); -- odps.sql.decimal.tostring.trimzero パラメーターを true に設定するか、odps.sql.decimal.tostring.trimzero パラメーターを構成しません。 set odps.sql.decimal.tostring.trimzero=true; -- 10 進数の末尾の 0 を削除します。 select cast(round(dcm1,3) as string),cast(round(dcm2,3) as string) from mf_dot; -- 次の結果が返されます。 +------------+------------+ | _c0 | _c1 | +------------+------------+ | 12.455 | 12.34 | +------------+------------+ -- odps.sql.decimal.tostring.trimzero パラメーターを false に設定します。 set odps.sql.decimal.tostring.trimzero=false; -- 10 進数の末尾の 0 を保持します。 select cast(round(dcm1,3) as string),cast(round(dcm2,3) as string) from mf_dot; -- 次の結果が返されます。 +------------+------------+ | _c0 | _c1 | +------------+------------+ | 12.455 | 12.340 | +------------+------------+ -- odps.sql.decimal.tostring.trimzero パラメーターは、静的値には影響しません。 set odps.sql.decimal.tostring.trimzero=false; select cast(round(12345.120BD,3) as string); -- 次の結果が返されます。 +------------+ | _c0 | +------------+ | 12345.12 | +------------+
例 8: STRING 型と JSON 型の間で値を変換します。
-- JSON 数値を STRING 型の値に変換します。 select cast(json '123' as string); -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | 123 | +-----+ -- JSON 文字列を STRING 型の値に変換します。 select cast(json '"abc"' as string); -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | abc | +-----+ -- JSON ブール値を STRING 型の値に変換します。 select cast(json 'true' as string); -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | TRUE | +-----+ -- JSON 'null' を STRING 型の null 値に変換します。 select cast(json 'null' as string); -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | NULL | +-----+ -- 文字列を JSON 型の値に変換します。 select cast('{"a":2}' as json); -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | "{\"a\":2}" | +-----+ -- 誤ったサンプルステートメント。ARRAY 型または OBJECT 型の JSON 式を STRING 型の値に変換します。 select cast(json '{"a":2}' as string); -- エラーが返されます。 FAILED: ODPS-0123091:Illegal type cast - Unsupported cast from json array/object to string例 9: NUMBER 型と 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 型の値を BIGINT 型に変換します。 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 | +------+ -- JSON 配列または JSON オブジェクトを BOOLEAN 型に変換します。 select cast(json '[1,2]' as boolean); -- エラーが返されます。 Unsupported cast from json array/object to boolean例 11: null 値と JSON 型の値の間で変換します。
-- null 値を STRING 型の値に変換します。 select json_type(cast(null as json)); -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | NULL | +-----+
関連関数
CAST は複雑な型の関数です。ARRAY、MAP、STRUCT、JSON などの複雑なデータ型のデータを処理するために使用される関数については、詳細については、「複雑な型の関数」をご参照ください。
CAST は、他のビジネスシナリオで使用される関数としても分類されます。他のビジネスシナリオで使用される関数について詳しくは、「その他の関数」をご参照ください。