运算符是构建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。