全部产品
阿里云办公

系统运算符

更新时间:2018-09-29 16:18:40

1 逻辑运算符

运算符 描述 例子
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:

  1. SELECT CAST(null AS boolean) AND true; -- null
  2. SELECT CAST(null AS boolean) AND false; -- false
  3. SELECT CAST(null AS boolean) AND CAST(null AS boolean); -- null

当运算符 OR 的输入中包含 TRUE 时必然返回 TRUE, 否则如果输入中包含了 NULL,则会返回 NULL:

  1. SELECT CAST(null AS boolean) OR CAST(null AS boolean); -- null
  2. SELECT CAST(null AS boolean) OR false; -- null
  3. 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 上的操作实例如下:

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

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

a NOT a
TRUE FALSE
FALSE TRUE
NULL NULL

2 比较运算符

运算符 描述
< 小于
> 大于
<= 小于等于
>= 大于等于
= 等于
<> 不等于
!= 不等于 (非标准语法)

区间运算符: BETWEEN

BETWEEN 运算符用来判断值是否在区间里, 使用语法固定为 value BETWEEN min AND max:

  1. SELECT 3 BETWEEN 2 AND 6;

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

  1. SELECT 3 >= 2 AND 3 <= 6;

判断值是否在区间外可以使用 NOT BETWEEN:

  1. SELECT 3 NOT BETWEEN 2 AND 6;

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

  1. SELECT 3 < 2 OR 3 > 6;

BETWEEN or NOT BETWEEN 运算符中出现 NULL 都会使结果为 NULL:

  1. SELECT NULL BETWEEN 2 AND 4; -- null
  2. SELECT 2 BETWEEN NULL AND 6; -- null

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

  1. 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 NULL and IS NOT NULL 运算符用于测试值是否为 NULL (未定义)。这两个运算符对所有数据类型有效。

IS NULL 判断 NULL 值会返回 TRUE:

  1. select NULL IS NULL; -- true

但是其他任务非 NULL 值都会返回 FALSE:

  1. SELECT 3.0 IS NULL; -- false

IS DISTINCT FROM and IS NOT DISTINCT FROM

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

  1. SELECT NULL IS DISTINCT FROM NULL; -- false
  2. 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 and LEAST

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

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

greatest(value1, value2) → [same as input]

返回参数中的最大值。

least(value1, value2) → [same as input]

返回参数中的最小值。

比较运算符支持的量词: ALL, ANY and SOME

ALL, ANY and SOME 量词可以和比较运算符结合使用:

  1. expression operator quantifier ( subquery )

例如:

  1. SELECT 'hello' = ANY (VALUES 'hello', 'world'); -- true
  2. SELECT 21 < ALL (VALUES 19, 20, 21); -- false
  3. 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 含义相同,可以互换使用。

3 字符串运算符

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

4 数学运算符

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

5 日期时间运算符

运算符 示例 结果
+ 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

6 数组运算符

Subscript Operator: []

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

  1. SELECT my_array[1] AS first_element

Concatenation Operator: ||

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

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

7 MAP运算符

Subscript Operator: []

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

  1. SELECT name_to_age_map['Bob'] AS bob_age;