系统运算符(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 NULL
和IS 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
输入时都会返回 NULL
。 IS DISTINCT FROM
和IS 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
ALL
、ANY
、SOME
量词可以和比较运算符结合使用:
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小于任意某个匹配数据。 |
ANY
和SOME
含义相同,可以互换使用。
字符串运算符
运算符||
完成字符串连接操作。
数学运算符
运算符 | 描述 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除(整形除法会截断) |
% | 模数(余数) |
日期时间运算符
运算符 | 示例 | 结果 |
+ |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
- |
|
|
|
| |
|
| |
|
| |
|
| |
|
|
数组运算符
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;