運算子是構建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是字串常量或者Regex。如果匹配成功,返回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。