本文介绍系统运算符的含义和用法。

逻辑运算符

运算符描述例子
ANDa和b两者都为true则返回Truea AND b
ORa或b有一个为true就返回Truea OR b
NOTa为false则返回TrueNOT a
Null值对逻辑运算符的影响
当运算符AND的输入中包含FALSE时必然返回FALSE,否则如果输入中包含了NULL,则会返回NULL,示例如下。
SELECT CAST(null AS boolean) AND true; -- null

SELECT CAST(null AS boolean) AND false; -- false

SELECT CAST(null AS boolean) AND CAST(null AS boolean); -- null
当运算符OR的输入中包含TRUE时必然返回TRUE,否则如果输入中包含了NULL,则会返回NULL,示例如下。
SELECT CAST(null AS boolean) OR CAST(null AS boolean); -- null

SELECT CAST(null AS boolean) OR false; -- null

SELECT CAST(null AS boolean) OR true; -- true
下表详细列举了NULL参与AND和OR逻辑运算的结果。
aba AND ba OR b
TRUETRUETRUETRUE
TRUEFALSEFALSETRUE
TRUENULLNULLTRUE
FALSETRUEFALSETRUE
FALSEFALSEFALSEFALSE
FALSENULLFALSENULL
NULLTRUENULLTRUE
NULLFALSEFALSENULL
NULLNULLNULLNULL
NOT运算符在NULL上的操作示例如下:
SELECT NOT CAST(null AS boolean); -- null
下表详细列举了NULL参与NOT逻辑运算的结果。
aNOT a
TRUEFALSE
FALSETRUE
NULLNULL

比较运算符

运算符描述
<小于
>大于
<=小于等于
>=大于等于
=等于
<>不等于
!=不等于(非标准语法)
区间运算符: BETWEEN
BETWEEN运算符用来判断值是否在区间里, 使用语法固定为 value BETWEEN min AND max,示例如下:
SELECT 3 BETWEEN 2 AND 6;
上例中的查询语句等同于如下语句:
SELECT 3 >= 2 AND 3 <= 6;

判断值是否在区间外可以使用 NOT BETWEEN,示例如下:

SELECT 3 NOT BETWEEN 2 AND 6;

上例中的查询语句等同于如下语句:

SELECT 3 < 2 OR 3 > 6;

BETWEEN or NOT BETWEEN 运算符中出现NULL都会使结果为NULL,示例如下:

SELECT NULL BETWEEN 2 AND 4; -- null

SELECT 2 BETWEEN NULL AND 6; -- null

BETWEEN and NOT BETWEEN 运算符同样可以作用于字符串型数据判断,示例如下:

SELECT 'Paul' BETWEEN 'John' AND 'Ringo'; -- true

必须注意的是,BETWEEN and NOT BETWEEN 运算符的输入数据类型必须相同。例如,判断‘John’ is between 2.3 and 35.2会使数据库报错。

IS NULL和IS NOT NULL

IS NULLIS NOT NULL 运算符用于测试值是否为NULL(未定义)。这两个运算符对所有数据类型有效。

IS NULL判断NULL值会返回TRUE

select NULL IS NULL; -- true

但是其他任务非NULL值都会返回FALSE,示例如下:

SELECT 3.0 IS NULL; -- false
IS DISTINCT FROM和IS NOT DISTINCT FROM

在SQL语义中NULL代表一个未知的值,所以任何比较运算符在接收NULL输入时都会返回 NULLIS DISTINCT FROMIS NOT DISTINCT FROM运算符会把NULL当成特殊的值, 当这两个运算符的输入中包含NULL时,它们仍然会返回True或者False,示例如下:

SELECT NULL IS DISTINCT FROM NULL; -- false

SELECT NULL IS NOT DISTINCT FROM NULL; -- true

在上面的例子中, 两个NULL值被认为是重复的。当你的比较运算数据中可能包含NULL值时,你可以使用这两个运算符来确保获得TRUE或者FALSE结果。

下表详细列举了NULL参与比较运算符时产生的结果。

aba = ba <> ba DISTINCT ba NOT DISTINCT b
11TRUEFALSEFALSETRUE
12FALSETRUETRUEFALSE
1NULLNULLNULLTRUEFALSE
NULLNULLNULLNULLFALSETRUE
GREATEST和LEAST

这两个函数不在标准的SQL语法中,是很常见的扩展。 和其他比较运算符一样,当函数的输入中出现NULL时函数返回结果为NULL。 在一些其他数据库,例如PostgreSQL中,只有当输入全部为NULL时才返回NULL

比较函数支持以下数据类型: DOUBLE、BIGINT、VARCHAR、TIMESTAMP、TIMESTAMP WITH TIME ZONE、DATE

greatest(value1, value2, ... valueN)

返回参数中的最大值。

least(value1, value2, ... valueN)

返回参数中的最小值。

比较运算符支持的量词: ALL、ANY和SOME

ALLANYSOME0量词可以和比较运算符结合使用:

expression operator quantifier ( subquery )

例如:

SELECT 'hello' = ANY (VALUES 'hello', 'world'); -- true

SELECT 21 < ALL (VALUES 19, 20, 21); -- false

SELECT 42 >= SOME (SELECT 41 UNION ALL SELECT 42 UNION ALL SELECT 43); -- true

下表列举了比较运算符和量词组合的一些含义:

表达式含义
A = ALL (…)返回true当A等于所有匹配数据时。
A <> ALL (…)返回true当A不等于所有匹配数据时。
A < ALL (…)返回true当A小于所有匹配数据时。
A = ANY (…)返回true当A等于任意某个匹配数据。 语义和 A IN (…) 相同。
A <> ANY (…)返回true当A不等于任意某个匹配数据。
A < ANY (…)返回true当A小于任意某个匹配数据。

ANYSOME含义相同,可以互换使用。

字符串运算符

运算符||完成字符串连接操作。

数学运算符

运算符描述
+
-
*
/除(整形除法会截断)
%模数(余数)

日期时间运算符

运算符示例结果
+date ‘2012-08-08’ + interval ‘2’ day2012-08-10
time ‘01:00’ + interval ‘3’ hour04:00:00.000
timestamp ‘2012-08-08 01:00’ + interval ‘29’ hour2012-08-09 06:00:00.000
timestamp ‘2012-10-31 01:00’ + interval ‘1’ month2012-11-30 01:00:00.000
interval ‘2’ day + interval ‘3’ hour2 03:00:00.000
interval ‘3’ year + interval ‘5’ month3-5
-date ‘2012-08-08’ - interval ‘2’ day2012-08-06
time ‘01:00’ - interval ‘3’ hour22:00:00.000
timestamp ‘2012-08-08 01:00’ - interval ‘29’ hour2012-08-06 20:00:00.000
timestamp ‘2012-10-31 01:00’ - interval ‘1’ month2012-09-30 01:00:00.000
interval ‘2’ day - interval ‘3’ hour1 21:00:00.000
interval ‘3’ year - interval ‘5’ month2-7

数组运算符

Subscript Operator: []

[]操作符用来获取数组的某个元素:

SELECT my_array[1] AS first_element
Concatenation Operator: ||

||操作符可以将相同类型的数组或元素连接:

SELECT ARRAY [1] || ARRAY [2]; -- [1, 2]
SELECT ARRAY [1] || 2; -- [1, 2]
SELECT 2 || ARRAY [1]; -- [2, 1]

MAP运算符

Subscript Operator: []

[]运算符用于取出map中指定键的值:

SELECT name_to_age_map['Bob'] AS bob_age;