數(shù)據(jù)類(lèi)型轉(zhuǎn)換
MaxCompute SQL允許數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,類(lèi)型轉(zhuǎn)換方式包括顯式類(lèi)型轉(zhuǎn)換和隱式類(lèi)型轉(zhuǎn)換。
顯式類(lèi)型轉(zhuǎn)換
顯式類(lèi)型轉(zhuǎn)換是通過(guò)CAST函數(shù)將一種數(shù)據(jù)類(lèi)型的值轉(zhuǎn)換為另一種類(lèi)型的值,在MaxCompute SQL中支持的顯式類(lèi)型轉(zhuǎn)換,如下表所示。 關(guān)于CAST的介紹請(qǐng)參見(jiàn)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 |
FLOAT | Y | Y | Y | N | Y | Y | 不涉及 |
其中,Y表示可以轉(zhuǎn)換,N表示不可以轉(zhuǎn)換,不涉及表示不需要轉(zhuǎn)換。不支持的顯式類(lèi)型轉(zhuǎn)換會(huì)失敗并報(bào)錯(cuò)退出。
示例數(shù)據(jù):
說(shuō)明本文中使用示例涉及
user
表的示例,都可使用此示例數(shù)據(jù)。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>));
使用說(shuō)明和限制
將DOUBLE類(lèi)型轉(zhuǎn)為BIGINT類(lèi)型時(shí),小數(shù)部分會(huì)被截?cái)啵?span data-tag="ph" id="codeph-kyp-1bp-n5g" class="ph">
CAST(1.6 AS BIGINT) = 1
。滿(mǎn)足DOUBLE格式的STRING類(lèi)型轉(zhuǎn)換為BIGINT時(shí),會(huì)先將STRING轉(zhuǎn)換為DOUBLE,再將DOUBLE轉(zhuǎn)換為BIGINT,因此,小數(shù)部分會(huì)被截?cái)啵?span data-tag="ph" id="codeph-6w4-kqu-jj7" class="ph">
CAST(“1.6” AS BIGINT) = 1
。滿(mǎn)足BIGINT格式的STRING類(lèi)型可以被轉(zhuǎn)換為DOUBLE類(lèi)型,小數(shù)點(diǎn)后保留一位,例如
CAST(“1” AS DOUBLE) = 1.0
。日期類(lèi)型轉(zhuǎn)換時(shí)采用默認(rèn)格式
yyyy-mm-dd hh:mi:ss
。部分類(lèi)型之間不可以通過(guò)顯式的類(lèi)型轉(zhuǎn)換,但可以通過(guò)SQL內(nèi)建函數(shù)進(jìn)行轉(zhuǎn)換,例如從BOOLEAN類(lèi)型轉(zhuǎn)換到STRING類(lèi)型,可使用函數(shù)
TO_CHAR
,詳情請(qǐng)參見(jiàn)TO_CHAR。而TO_DATE
函數(shù)同樣支持從STRING類(lèi)型到DATETIME類(lèi)型的轉(zhuǎn)換,詳情請(qǐng)參見(jiàn)TO_DATE。DECIMAL超出值域,
CAST STRING TO DECIMAL
可能會(huì)出現(xiàn)最高位溢出報(bào)錯(cuò)、最低位溢出截?cái)嗟惹闆r。DECIMAL類(lèi)型顯示轉(zhuǎn)換為DOUBLE、FLOAT等類(lèi)型會(huì)產(chǎn)生精度損失,對(duì)于精度有要求的場(chǎng)景,例如計(jì)算金額、費(fèi)率等,建議使用DECIMAL類(lèi)型。
MaxCompute支持復(fù)雜類(lèi)型的類(lèi)型轉(zhuǎn)換功能。其中復(fù)雜類(lèi)型的隱式類(lèi)型轉(zhuǎn)換要求子類(lèi)型能夠隱式轉(zhuǎn)換,而顯示轉(zhuǎn)換要求子類(lèi)型能夠顯示轉(zhuǎn)換。STRUCT類(lèi)型轉(zhuǎn)換不要求字段名稱(chēng)一致,但是要求字段的數(shù)量一致,且對(duì)應(yīng)的字段能夠隱式或顯示轉(zhuǎn)換。例如:
ARRAY<BIGINT>
能隱式轉(zhuǎn)換或顯示轉(zhuǎn)換為ARRAY<STRING>
。ARRAY<BIGINT>
能顯示轉(zhuǎn)換為ARRAY<INT>
,但是不能隱式轉(zhuǎn)換。ARRAY<BIGINT>
不能隱式轉(zhuǎn)換或顯示轉(zhuǎn)換為ARRAY<DATETIME>
。STRUCT<a:BIGINT,b:INT>
能隱式轉(zhuǎn)換為STRUCT<col1:STRING,col2:BIGINT>
,但是不能隱式或顯示轉(zhuǎn)換為STRUCT<a:STRING>
。
隱式類(lèi)型轉(zhuǎn)換及其作用域
隱式類(lèi)型轉(zhuǎn)換是指在運(yùn)行時(shí),由MaxCompute依據(jù)上下文使用環(huán)境及類(lèi)型轉(zhuǎn)換規(guī)則自動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換。MaxCompute支持的隱式類(lèi)型轉(zhuǎn)換規(guī)則,如下表所示。
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 | 不涉及 | N | N |
TIMESTAMP | N | N | Y | Y | 不涉及 | N |
BINARY | N | N | N | N | N | 不涉及 |
其中,Y表示可以轉(zhuǎn)換,N表示不可以轉(zhuǎn)換,不涉及表示不需要轉(zhuǎn)換。不支持的隱式類(lèi)型轉(zhuǎn)換會(huì)導(dǎo)致異常。如果在執(zhí)行時(shí)轉(zhuǎn)換失敗,也會(huì)導(dǎo)致異常。
MaxCompute 2.0新增了DECIMAL類(lèi)型與DATETIME的常量定義方式,100BD是數(shù)值為100的DECIMAL,
2017-11-11 00:00:00
是DATETIME類(lèi)型的常量。VALUES子句和VALUES表中可以直接使用常量定義。由于隱式類(lèi)型轉(zhuǎn)換是MaxCompute依據(jù)上下文使用環(huán)境自動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換,因此推薦您在類(lèi)型不匹配時(shí),顯式地用CAST進(jìn)行轉(zhuǎn)換。
隱式類(lèi)型轉(zhuǎn)換規(guī)則是有發(fā)生作用域的。在某些作用域中,只有一部分規(guī)則可以生效。
示例
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;
不同運(yùn)算符作用下的隱式轉(zhuǎn)換如下:
關(guān)系運(yùn)算符作用下的隱式轉(zhuǎn)換
關(guān)系運(yùn)算符包括
=、<>、<、<=、>、>=、IS NULL、IS NOT NULL、LIKE、RLIKE、IN
。由于LIKE、RLIKE、IN
的隱式類(lèi)型轉(zhuǎn)換規(guī)則不同于其他關(guān)系運(yùn)算符,將單獨(dú)對(duì)其進(jìn)行說(shuō)明。此處的說(shuō)明不包含這三種特殊的關(guān)系運(yùn)算符。當(dāng)不同類(lèi)型的數(shù)據(jù)共同參與關(guān)系運(yùn)算時(shí),按照下述原則進(jìn)行隱式類(lèi)型轉(zhuǎn)換。
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
不涉及
說(shuō)明如果進(jìn)行比較的兩個(gè)類(lèi)型間不能進(jìn)行隱式類(lèi)型轉(zhuǎn)換,則該關(guān)系運(yùn)算不能完成,報(bào)錯(cuò)退出。
關(guān)系運(yùn)算符的更多詳情,請(qǐng)參見(jiàn)運(yùn)算符。
特殊的關(guān)系運(yùn)算符作用下的隱式轉(zhuǎn)換
特殊的關(guān)系運(yùn)算符包括
LIKE、RLIKE、IN
。LIKE和RLIKE的使用方式,如下所示。
source LIKE pattern; source RLIKE pattern;
說(shuō)明LIKE和RLIKE的source和pattern參數(shù)均僅接受STRING類(lèi)型。
其他類(lèi)型不允許參與運(yùn)算,也不能進(jìn)行到STRING類(lèi)型的隱式類(lèi)型轉(zhuǎn)換。
IN的使用方式如下。
key IN (value1, value2, …)
說(shuō)明IN右側(cè)的VALUE值列表中的數(shù)據(jù)類(lèi)型必須保持一致。
當(dāng)KEY與VALUES之間比較時(shí),如果數(shù)據(jù)類(lèi)型包含BIGINT、DOUBLE、STRING,建議統(tǒng)一轉(zhuǎn)換為DOUBLE類(lèi)型;如果數(shù)據(jù)類(lèi)型包含DATETIME、STRING,建議統(tǒng)一轉(zhuǎn)換為DATETIME類(lèi)型。除此之外不允許其他類(lèi)型之間的轉(zhuǎn)換。
算術(shù)運(yùn)算符作用下的隱式轉(zhuǎn)換
算術(shù)運(yùn)算符包括
+、-、*、/、%
,其隱式轉(zhuǎn)換規(guī)則如下:只有STRING、BIGINT、DOUBLE和DECIMAL才能參與算術(shù)運(yùn)算。
STRING在參與運(yùn)算前會(huì)進(jìn)行隱式類(lèi)型轉(zhuǎn)換到DOUBLE。
BIGINT和DOUBLE共同參與計(jì)算時(shí),會(huì)將BIGINT隱式轉(zhuǎn)換為DOUBLE。
日期型和布爾型不允許參與算數(shù)運(yùn)算。
邏輯運(yùn)算符作用下的隱式轉(zhuǎn)換
邏輯運(yùn)算符包括
and、or、not
,其隱式轉(zhuǎn)換規(guī)則,如下:只有BOOLEAN才能參與邏輯運(yùn)算。
其他類(lèi)型不允許參與邏輯運(yùn)算,也不允許其他類(lèi)型的隱式類(lèi)型轉(zhuǎn)換。
內(nèi)建函數(shù)涉及到的隱式轉(zhuǎn)換
MaxCompute SQL提供了大量的系統(tǒng)函數(shù),方便您對(duì)任意行的一列或多列進(jìn)行計(jì)算,輸出任意種類(lèi)的數(shù)據(jù)類(lèi)型。其隱式轉(zhuǎn)換規(guī)則如下:
在調(diào)用函數(shù)時(shí),如果輸入?yún)?shù)的數(shù)據(jù)類(lèi)型與函數(shù)定義的參數(shù)數(shù)據(jù)類(lèi)型不一致,把輸入?yún)?shù)的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為函數(shù)定義的數(shù)據(jù)類(lèi)型。
每個(gè)MaxCompute SQL內(nèi)建函數(shù)的參數(shù)對(duì)于允許的隱式類(lèi)型轉(zhuǎn)換的要求不同,詳情請(qǐng)參見(jiàn)內(nèi)建函數(shù)概述。
CASE WHEN作用下的隱式轉(zhuǎn)換
CASE WHEN的詳情介紹請(qǐng)參見(jiàn)CASE WHEN表達(dá)式。它的隱式轉(zhuǎn)換規(guī)則,如下:
如果返回類(lèi)型只有BIGINT、DOUBLE,統(tǒng)一轉(zhuǎn)換為DOUBLE。
如果返回類(lèi)型中有STRING類(lèi)型,統(tǒng)一轉(zhuǎn)換為STRING,如果不能轉(zhuǎn)換(如BOOLEAN類(lèi)型)則報(bào)錯(cuò)。
除此之外不允許其他類(lèi)型之間的轉(zhuǎn)換。
STRING與DATETIME類(lèi)型之間的轉(zhuǎn)換
MaxCompute支持STRING類(lèi)型和DATETIME類(lèi)型之間的相互轉(zhuǎn)換。轉(zhuǎn)換時(shí)使用的格式為yyyy-mm-dd hh:mi:ss
。
單位 | 字符串(忽略大小寫(xiě)) | 有效值域 |
年 | yyyy | 0001~9999 |
月 | mm | 01~12 |
日 | dd | 01~28|29|30|31 |
時(shí) | hh | 00~23 |
分 | mi | 00~59 |
秒 | ss | 00~59 |
各個(gè)單位的值域中,如果首位為0,不可省略。例如
2014-1-9 12:12:12
為非法的DATETIME格式,無(wú)法從STRING類(lèi)型數(shù)據(jù)轉(zhuǎn)換為DATETIME類(lèi)型,必須寫(xiě)為2014-01-09 12:12:12
。只有符合上述格式描述的STRING類(lèi)型才能夠轉(zhuǎn)換為DATETIME類(lèi)型,例如
CAST(“2013-12-31 02:34:34” AS DATETIME)
,將會(huì)把STRING類(lèi)型2013-12-31 02:34:34
轉(zhuǎn)換為DATETIME類(lèi)型。同理,DATETIME轉(zhuǎn)換為STRING時(shí),默認(rèn)轉(zhuǎn)換為yyyy-mm-dd hh:mi:ss
格式。
MaxCompute提供了TO_DATE函數(shù),用于將不滿(mǎn)足日期格式的STRING類(lèi)型數(shù)據(jù)轉(zhuǎn)換為DATETIME類(lèi)型。詳情請(qǐng)參見(jiàn)TO_DATE。