比较运算符

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

范围运算符:BETWEEN

BETWEEN 运算符用于判断一个值是否在指定范围内。它使用如下语法:

1
value BETWEEN min AND max

例如:

1
SELECT 3 BETWEEN 2 AND 6;  -- true

以上的语句等效于:

1
SELECT 3 >= 2 AND 3 <= 6;  -- true

要判断一个值是否不在指定范围内,则使用 NOT BETWEEN

1
SELECT 3 NOT BETWEEN 2 AND 6;  -- false

上述语句与以下语句等效:

1
SELECT 3 < 2 OR 3 > 6;  -- false

BETWEENNOT BETWEEN 语句中出现 NULL 将导致语句计算结果为 NULL:

1
2
3
SELECT NULL BETWEEN 2 AND 4; -- null

SELECT 2 BETWEEN NULL AND 6; -- null

BETWEENNOT BETWEEN 运算符也可以用于比较字符串参数:

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

注意,BETWEENNOT BETWEEN 的 value、min 和 max 参数必须是同一类型。例如,判断字符串 Presto John 是否在 2.3 和 35.2 之间,将会产生一个错误:

1
SELECT 'Presto John' BETWEEN 2.3 AND 35.2
1
Cannot check if varchar(11) is BETWEEN decimal(2,1) and decimal(3,1)

IS NULL 和 IS NOT NULL

IS NULLIS NOT NULL 运算符用于判断一个值是否为 NULL。两个运算符适用于所有数据类型。
将 NULL 与 IS NULL 一起使用会返回 true:

1
select NULL IS NULL; -- true

但任何其他常量不会:

1
SELECT 3.0 IS NULL; -- false

IS DISTINCT FROM 和 IS NOT DISTINCT FROM

在 SQL 中,NULL 值表示未知值,因此涉及 NULL 的任何比较都会产生 NULLIS DISTINCT FROMIS NOT DISTINCT FROM 运算符将 NULL 视为已知值,且这两个运算符即使在存在 NULL 输入的情况下也保证会产生真或假结果:

1
2
3
SELECT NULL IS DISTINCT FROM NULL; -- false

SELECT NULL IS NOT DISTINCT FROM NULL; -- true

在上述示例中,NULL 值不被视为与 NULL 不同。当比较可能包含 NULL 的值时,使用这些运算符以保证得到 TRUE 或 FALSE 结果。

以下真值表演示了 IS DISTINCT FROM 和 IS NOT DISTINCT FROM 中的 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 标准中,但是一种常见的扩展。与 Presto 中的大多数其他函数一样,如果任何参数为 null,它们将返回 null。请注意,在某些其他数据库(如 PostgreSQL)中,只有当所有参数都为 null 时,它们才会返回 null。

支持以下类型:

DOUBLEBIGINTVARCHARTIMESTAMPTIMESTAMP WITH TIME ZONEDATE

greatest(value1, value2, , valueN) → [与输入类型相同]

返回提供的值中最大的值。

least(value1, value2, , valueN) → [同输入]

返回提供的值中最小的值。

量化比较谓词: ALL, ANY 和 SOME

ALLANYSOME 量词可以与比较运算符结合使用,如下所示:

1
expression operator quantifier ( subquery )

例如:

1
2
3
4
5
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 (…) 当 A 等于所有的值时,结果为 true。
A <> ALL (…) 当 A 不匹配任何值时,结果为 true。
A < ALL (…) 当 A 小于最小值时,结果为 true。
A = ANY (…) 当 A 等于其中任意值时,结果为 true。这种形式等价于 A IN (…)。
A <> ANY (…) 当 A 不匹配其中任意一个值时,结果为 true。
A < ANY (…) 当 A 小于最大值时,结果为 true。

ANYSOME 的意思相同,可以互换使用。

示例

1
2
SELECT * FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'Toys');

这个查询将返回价格高于所有玩具商品价格的商品。

1
2
SELECT * FROM products
WHERE price > ANY (SELECT price FROM products WHERE category = 'Toys');

这个查询将返回价格高于任一玩具商品价格的商品。

LIKE

LIKE 运算符用于匹配字符串中的指定字符模式。模式可以包含普通字符和通配符。通配符可以使用 ESCAPE 参数指定的单个字符进行转义。匹配区分大小写。
语法:

1
expression LIKE pattern [ ESCAPE 'escape_character' ]

如果 patternescape_character 为 null,则表达式的计算结果为 null。

通配符 表示
% 百分号表示零个、一个或多个字符
_ 下划线表示一个字符

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE '%b%'
--returns 'abc' and 'bcd'

SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE '_b%'
--returns 'abc'

SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE 'b%'
--returns 'bcd'

SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE 'B%'
--returns nothing

SELECT * FROM (VALUES ('a_c'), ('_cd'), ('cde')) AS t (name)
WHERE name LIKE '%#_%' ESCAPE '#'
--returns 'a_c' and '_cd'

SELECT * FROM (VALUES ('a%c'), ('%cd'), ('cde')) AS t (name)
WHERE name LIKE '%#%%' ESCAPE '#'
--returns 'a%c' and '%cd'

(END)