系统运算符(2.0版)

更新时间:

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

逻辑运算符

运算符

描述

例子

AND

a和b两者都为true则返回True

a AND b

OR

a或b有一个为true就返回True

a OR b

NOT

a为false则返回True

NOT 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逻辑运算的结果。

a

b

a AND b

a OR b

TRUE

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

TRUE

TRUE

NULL

NULL

TRUE

FALSE

TRUE

FALSE

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE

NULL

FALSE

NULL

NULL

TRUE

NULL

TRUE

NULL

FALSE

FALSE

NULL

NULL

NULL

NULL

NULL

NOT运算符在NULL上的操作示例如下:

SELECT NOT CAST(null AS boolean); -- null

下表详细列举了NULL参与NOT逻辑运算的结果。

a

NOT a

TRUE

FALSE

FALSE

TRUE

NULL

NULL

比较运算符

运算符

描述

<

小于

>

大于

<=

小于等于

>=

大于等于

=

等于

<>

不等于

!=

不等于(非标准语法)

区间运算符: 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参与比较运算符时产生的结果。

a

b

a = b

a <> b

a DISTINCT b

a NOT DISTINCT b

1

1

TRUE

FALSE

FALSE

TRUE

1

2

FALSE

TRUE

TRUE

FALSE

1

NULL

NULL

NULL

TRUE

FALSE

NULL

NULL

NULL

NULL

FALSE

TRUE

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

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

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’ day

2012-08-10

time ‘01:00’ + interval ‘3’ hour

04:00:00.000

timestamp ‘2012-08-08 01:00’ + interval ‘29’ hour

2012-08-09 06:00:00.000

timestamp ‘2012-10-31 01:00’ + interval ‘1’ month

2012-11-30 01:00:00.000

interval ‘2’ day + interval ‘3’ hour

2 03:00:00.000

interval ‘3’ year + interval ‘5’ month

3-5

-

date ‘2012-08-08’ - interval ‘2’ day

2012-08-06

time ‘01:00’ - interval ‘3’ hour

22:00:00.000

timestamp ‘2012-08-08 01:00’ - interval ‘29’ hour

2012-08-06 20:00:00.000

timestamp ‘2012-10-31 01:00’ - interval ‘1’ month

2012-09-30 01:00:00.000

interval ‘2’ day - interval ‘3’ hour

1 21:00:00.000

interval ‘3’ year - interval ‘5’ month

2-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;