MaxCompute CAST是資料類型轉換函式,支援將一個運算式結果(expr)轉換成目標資料類型(type)。本文為您介紹CAST函數的命令格式、參數說明以及使用樣本。
命令格式
cast(<expr> as <type>)
參數說明
expr:必填。待轉換資料來源。
type:必填。目標資料類型。用法如下:
cast(double as bigint)
:將DOUBLE資料類型值轉換成BIGINT資料類型。cast(string as bigint)
:在將字串轉為BIGINT資料類型時,如果字串中是以整型表達的數字,則會直接將它們轉為BIGINT類型。如果字串中是以浮點數或指數形式表達的數字,則會先轉為DOUBLE資料類型,再轉為BIGINT資料類型。cast(string as datetime)
或cast(datetime as string)
:會採用預設的日期格式yyyy-mm-dd hh:mi:ss
。
除此之外,cast還支援基礎資料型別 (Elementary Data Type)與JSON類型之間的相互轉換,所支援的類型包括:
JSON/STRING/BIGINT/INT/TINYINT/SMALLINT/DOUBLE/FLOAT/BOOLEAN/SQL-TYPE
。樣本用法如下:cast(json as string)
:將JSON運算式轉換為STRING類型。JSON運算式要求為非ARRAY和OBJECT類型。cast(string as json)
:將STRING類型值轉換為JSON運算式,JSON運算式的類型為STRING。注意其與json_parse和json_format的區別,json_parse只支援合法的JSON STRING轉成JSON,而且可以轉成JSON OBJECT ,而cast(string as json) 可以將任意STRING轉成JSON STRING,JSON類型是STRING。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資料類型,當STRING為空白字串時返回
false
,否則返回true
。命令樣本如下。STRING為空白字串。
select cast("" as boolean); --返回 +------+ | _c0 | +------+ | false | +------+
STRING為非Null 字元串。
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資料 insert into table mf_dot values (12.45500BD,12.3400BD); --Flag為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 | +------------+------------+ --Flag為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.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轉成string select cast(json 'null' as string); --返回: +-----+ | _c0 | +-----+ | NULL | +-----+ --string轉成json select cast('{"a":2}' as json); --返回: +-----+ | _c0 | +-----+ | "{\"a\":2}" | +-----+ --json轉成string的錯誤樣本,不支援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 | +------+ --array/object不能轉成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函數也屬於其他函數,更多其他業務情境的函數請參見其他函數。