Presto | 比较运算符和函数
比较运算符
运算符 | 描述 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
= | 等于 |
<> | 不等于 |
!= | 不等于(非标准但常用的语法) |
范围运算符: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 |
在 BETWEEN
或 NOT BETWEEN
语句中出现 NULL 将导致语句计算结果为 NULL:
1 | SELECT NULL BETWEEN 2 AND 4; -- null |
BETWEEN
和 NOT BETWEEN
运算符也可以用于比较字符串参数:
1 | SELECT 'Paul' BETWEEN 'John' AND 'Ringo'; -- true |
注意,BETWEEN
和 NOT 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 NULL
和 IS 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
的任何比较都会产生 NULL
。IS DISTINCT FROM
和 IS NOT DISTINCT FROM
运算符将 NULL
视为已知值,且这两个运算符即使在存在 NULL
输入的情况下也保证会产生真或假结果:
1 | SELECT NULL IS DISTINCT FROM NULL; -- false |
在上述示例中,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。
支持以下类型:
DOUBLE
、BIGINT
、VARCHAR
、TIMESTAMP
、TIMESTAMP WITH TIME ZONE
、DATE
greatest(value1, value2, …, valueN) → [与输入类型相同]
返回提供的值中最大的值。
least(value1, value2, …, valueN) → [同输入]
返回提供的值中最小的值。
量化比较谓词: ALL, ANY 和 SOME
ALL
、ANY
和 SOME
量词可以与比较运算符结合使用,如下所示:
1 | expression operator quantifier ( subquery ) |
例如:
1 | SELECT 'hello' = ANY (VALUES 'hello', 'world'); -- 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。 |
ANY
和 SOME
的意思相同,可以互换使用。
示例
1 | SELECT * FROM products |
这个查询将返回价格高于所有玩具商品价格的商品。
1 | SELECT * FROM products |
这个查询将返回价格高于任一玩具商品价格的商品。
LIKE
LIKE 运算符用于匹配字符串中的指定字符模式。模式可以包含普通字符和通配符。通配符可以使用 ESCAPE 参数指定的单个字符进行转义。匹配区分大小写。
语法:
1 | expression LIKE pattern [ ESCAPE 'escape_character' ] |
如果 pattern
或 escape_character
为 null,则表达式的计算结果为 null。
通配符 | 表示 |
---|---|
% | 百分号表示零个、一个或多个字符 |
_ | 下划线表示一个字符 |
示例
1 | SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name) |
(END)