运算符用于执行程序代码运算。本文为您介绍MaxCompute支持的运算符。

MaxCompute支持的运算符如下。

运算符类型说明
关系运算符用于比较运算。
算术运算符用于各类数值运算。
位运算符用于按照二进制位进行运算。
逻辑运算符用于多条件连接,一般用于连接BOOLEAN类型的表达式或者值。

关系运算符

运算符说明
A=B
  • A或B为NULL,返回NULL。
  • A等于B,返回TRUE,否则返回FALSE。
A<>B
  • A或B为NULL,返回NULL。
  • A不等于B,返回TRUE,否则返回FALSE。
A<B
  • A或B为NULL,返回NULL。
  • A小于B,返回TRUE,否则返回FALSE。
A<=B
  • A或B为NULL,返回NULL。
  • A小于等于B,返回TRUE,否则返回FALSE。
A>B
  • A或B为NULL,返回NULL。
  • A大于B,返回TRUE,否则返回FALSE。
A>=B
  • A或B为NULL,返回NULL。
  • A大于等于B,返回TRUE,否则返FALSE。
A IS NULLA为NULL,返回TRUE,否则返回FALSE。
A IS NOT NULLA不为NULL,返回TRUE,否则返回FALSE。
A LIKE B如果A或B为NULL,返回NULL。A为字符串,B为要匹配的模式,如果匹配,返回TRUE,否则返回FALSE。
  • 百分号(%)匹配任意多个字符。
  • 下划线(_)匹配单个字符。
  • 要匹配百分号(%)或下划线(_)要用转义符表示为‘%’‘_’
'aaa' like 'a__'= TRUE 
'aaa' like 'a%' = TRUE
'aaa' like 'aab'= FALSE 
'a%b' like 'a\\%b'= TRUE 
'axb' like 'a\\%b'= FALSE 
A RLIKE BA是字符串,B是字符串常量或者正则表达式。如果匹配成功,返回TRUE,否则返回FALSE。如果B为空串会报错。如果A或B为NULL,返回NULL。
A IN B
  • B为一个集合,如果A在B中,返回TRUE,否则返回FALSE。
  • 如果A为NULL,返回NULL。
  • 如果B包含一个NULL元素,则返回NULL。
  • B必须是常数集合且至少包含一个项,且所有项的数据类型需要一致。
BETWEEN AND表达式为A [NOT] BETWEEN B AND C
  • A、B或C为NULL,则为空。
  • A大于等于B且小于等于C,返回TRUE,否则返回FALSE。
IS [NOT] DISTINCT FROM表达式为A IS [NOT] DISTINCT FROM B。详情请参见IS DISTINCT FROMIS NOT DISTINCT FROM
A||B字符串连接操作符。例如a||b||c相当于CONCAT(a, b, c)
常见用法如下。
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+BA或B为NULL,返回NULL,否则返回A+B的结果。
A-BA或B为NULL,返回NULL,否则返回A-B的结果。
A*BA或B为NULL,返回NULL,否则返回A×B的结果。
A/BA或B为NULL,返回NULL,否则返回A÷B的结果。
说明 如果A和B为BIGINT类型,返回结果为DOUBLE类型。
A%BA或B为NULL,返回NULL,否则返回A÷B并取余数的结果。
+A仍然返回A。
-A如果A为NULL,返回NULL,否则返回-A。
A DIV BA或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类型的参数才能参与算术运算,日期和布尔类型不允许参与运算。
  • STRING类型在参与运算前会隐式转换为DOUBLE类型。
  • BIGINT和DOUBLE类型共同参与计算时,系统会将BIGINT类型隐式转换为DOUBLE类型再进行计算,返回结果为DOUBLE类型。
  • A和B都是BIGINT类型,执行A/B运算,返回结果为DOUBLE类型。执行上述其他运算,返回BIGINT类型。

位运算符

运算符示例说明
  • BITAND
  • &
  • BITAND(A,B)
  • A&B
返回A和B进行按位与运算的结果。例如1&2返回0,BITAND(1,3)返回1,NULL和任何值按位与运算都为NULL。A和B必须为BIGINT类型。
  • BITOR
  • |
  • BITOR(A,B)
  • A|B
返回A和B进行按位或运算的结果。例如1|2返回3,BITOR(1,3)返回3,NULL和任何值按位或运算都为NULL。A和B必须为BIGINT类型。
  • BITNOT
  • ~
  • BITNOT(A)
  • ~A
返回A按位非运算的结果。例如~1返回-2,BITNOT(7)返回-8,NULL值按位非运算都为NULL。A必须为BIGINT类型。
  • BITXOR
  • ^
  • BITXOR(A,B)
  • A^B
返回A和B进行按位异或运算的结果。例如1^2返回3,BITXOR(4,5)返回1,NULL和任何值按位异或运算都为NULL。A和B必须为BIGINT类型。
说明 位运算符不支持隐式转换,只允许BIGINT类型参与运算。

逻辑运算符

运算符说明
A and BTRUE 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 BTRUE 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 AA是NULL,返回NULL。
A是TRUE,返回FALSE。
A是FALSE,返回TRUE。
说明 逻辑运算符只允许BOOLEAN类型参与运算,不支持隐式类型转换。

运算符优先级

不同运算符的优先级如下表所示,从上到下优先级递减。相同优先级默认是从左到右进行计算。
运算符优先级
IS (NOT) NULL1
^2
*、/、%、DIV3
+、-4
||5
&6
|7
(NOT) LIKE、 (NOT) RLIKE、=、==、IS (NOT) DISTINCT FROM、<>、!=、<=、<、>=、>8
(NOT) IN、 (NOT) BETWEEN AND9
NOT10
AND11
OR12
如果某些运算要优先处理,需要添加英文括号。运算优先级示例如下。
a=1 and b=1 or c=1        --先计算a和b,再计算c。
a=1 and (b=1 or c=1)      --先计算b和c,再计算a。