運算符是構建SQL語句的關鍵,使得您可以執行復雜的數據檢索和操作任務,幫助您實現更有效率的數據處理、條件判斷或其他操作。本文為您介紹MaxCompute支持的運算符,包括運算符的格式、含義和使用示例。
MaxCompute支持的運算符如下。
運算符類型 | 說明 |
用于比較運算。 | |
用于字符串連接操作。 | |
用于各類數值運算。 | |
用于按照二進制位進行運算。 | |
用于多條件連接,一般用于連接BOOLEAN類型的表達式或者值。 |
關系運算符
運算符 | 說明 |
A=B |
|
A<=>B |
|
A<>B |
|
A<B |
|
A<=B |
|
A>B |
|
A>=B |
|
A IS NULL | A為NULL,返回TRUE,否則返回FALSE。 |
A IS NOT NULL | A不為NULL,返回TRUE,否則返回FALSE。 |
A LIKE B | 如果A或B為NULL,返回NULL。A為字符串,B為要匹配的模式,如果匹配,返回TRUE,否則返回FALSE。
|
A RLIKE B | A是字符串,B是字符串常量或者正則表達式。如果匹配成功,返回TRUE,否則返回FALSE。如果B為空串會報錯。如果A或B為NULL,返回NULL。 說明
|
A IN B |
|
BETWEEN AND | 表達式為
|
IS [NOT] DISTINCT FROM | 表達式為 |
常見用法如下。
SELECT * FROM user WHERE user_id = '0001';
SELECT * FROM user WHERE user_name <> 'maggie';
SELECT * FROM user WHERE age > '50';
SELECT * FROM user WHERE birth_day >= '1980-01-01 00:00:00';
SELECT * FROM user WHERE is_female is null;
SELECT * FROM user WHERE is_female is not null;
SELECT * FROM user WHERE user_id in (0001,0010);
SELECT * FROM user WHERE user_name like 'M%';
在執行部分關系運算之前,您首先需要進行類型轉換,否則可能返回NULL,詳情請參見數據類型轉換。
由于DOUBLE類型存在一定的精度差,因此,不建議您直接使用等于號(=)對兩個DOUBLE類型的數據進行比較。您可以將兩個DOUBLE類型數據相減,然后取絕對值進行判斷。當絕對值足夠小時,認為兩個DOUBLE數值相等,示例如下。
ABS(0.9999999999 - 1.0000000000) < 0.000000001
-- 0.9999999999和1.0000000000為10位精度,而0.000000001為9位精度。
-- 此時可以認為0.9999999999和1.0000000000相等。
ABS是MaxCompute提供的內建函數,用于取絕對值,詳情請參見ABS。
通常,MaxCompute的DOUBLE類型能夠保障14位有效數字。
比較STRING和BIGINT類型數值時,兩個類型都將自動轉換為DOUBLE類型,在比較過程中可能出現精度丟失現象。您可以通過CAST STRING AS BIGINT方式將STRING類型轉換為BIGINT類型后再比較。
字符操作符
字符操作符 | 說明 |
A||B | 字符串連接操作符。例如a||b||c相當于CONCAT(a, b, c)。 |
算術運算符
運算符 | 說明 |
A+B | A或B為NULL,返回NULL,否則返回A+B的結果。 |
A-B | A或B為NULL,返回NULL,否則返回A-B的結果。 |
A*B | A或B為NULL,返回NULL,否則返回A×B的結果。 |
A/B | A或B為NULL,返回NULL,否則返回A÷B的結果。 說明 如果A和B為BIGINT類型,返回結果為DOUBLE類型。 |
A%B | A或B為NULL,返回NULL,否則返回A÷B并取余數的結果。 |
+A | 仍然返回A。 |
-A | 如果A為NULL,返回NULL,否則返回-A。 |
A DIV B | A或B為NULL,返回NULL,否則返回A DIV B的結果。 |
常見用法如下。
SELECT age+10, age-10, age%10, -age, age*age, age/10, age div 10 FROM user;
STRING、BIGINT、DOUBLE和TIMESTAMP_NTZ類型的參數支持參與算術運算,日期和布爾類型不允許參與運算。關于TIMESTAMP_NTZ數據類型詳情,請參見MaxCompute TIMESTAMP_NTZ數據類型。
STRING類型在參與運算前會隱式轉換為DOUBLE類型。
BIGINT和DOUBLE類型共同參與計算時,系統會將BIGINT類型隱式轉換為DOUBLE類型再進行計算,返回結果為DOUBLE類型。
A和B都是BIGINT類型,執行A/B運算,返回結果為DOUBLE類型。執行上述其他運算,返回BIGINT類型。
位運算符
運算符 | 示例 | 說明 |
|
| 返回A和B進行按位與運算的結果。例如 |
|
| 返回A和B進行按位或運算的結果。例如 |
|
| 返回A按位非運算的結果。例如 |
|
| 返回A和B進行按位異或運算的結果。例如 |
位運算符不支持隱式轉換,只允許BIGINT類型參與運算。
邏輯運算符
運算符 | 說明 |
A and B | TRUE and TRUE=TRUE |
TRUE and FALSE=FALSE | |
FALSE and TRUE=FALSE | |
FALSE and FALSE=FALSE | |
FALSE and NULL=FALSE | |
NULL and FALSE=FALSE | |
TRUE and NULL=NULL | |
NULL and TRUE=NULL | |
NULL and NULL=NULL | |
A or B | TRUE or TRUE=TRUE |
TRUE or FALSE=TRUE | |
FALSE or TRUE=TRUE | |
FALSE or FALSE=FALSE | |
FALSE or NULL=NULL | |
NULL or FALSE=NULL | |
TRUE or NULL=TRUE | |
NULL or TRUE=TRUE | |
NULL or NULL=NULL | |
NOT A | A是NULL,返回NULL。 |
A是TRUE,返回FALSE。 | |
A是FALSE,返回TRUE。 |
邏輯運算符只允許BOOLEAN類型參與運算,不支持隱式類型轉換。
運算符優先級
不同運算符的優先級如下表所示,從上到下優先級遞減。相同優先級默認是從左到右進行計算。
運算符 | 優先級 |
IS (NOT) NULL | 1 |
^ | 2 |
*、/、%、DIV | 3 |
+、- | 4 |
|| | 5 |
& | 6 |
| | 7 |
(NOT) LIKE、 (NOT) RLIKE、=、==、IS (NOT) DISTINCT FROM、<>、!=、<=、<、>=、> | 8 |
(NOT) IN、 (NOT) BETWEEN AND | 9 |
NOT | 10 |
AND | 11 |
OR | 12 |
如果某些運算要優先處理,需要添加英文括號。運算優先級示例如下。
a=1 and b=1 or c=1 --先計算a和b,再計算c。
a=1 and (b=1 or c=1) --先計算b和c,再計算a。