比较函数和运算符¶
比较运算符¶
运算符 |
描述 |
---|---|
|
小于 |
|
大于 |
|
小于或等于 |
|
大于或等于 |
|
等于 |
|
不等于 |
|
不等于(非标准但流行的语法) |
范围运算符: 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
或 NOT BETWEEN
语句中存在 NULL 会导致语句评估为 NULL
SELECT NULL BETWEEN 2 AND 4; -- null
SELECT 2 BETWEEN NULL AND 6; -- null
BETWEEN
和 NOT BETWEEN
运算符也可以用于评估字符串参数
SELECT 'Paul' BETWEEN 'John' AND 'Ringo'; -- true
请注意,BETWEEN
和 NOT BETWEEN
的 value、min 和 max 参数必须是相同类型。例如,如果您要求 Presto 判断 John 是否在 2.3 到 35.2 之间,Presto 会产生错误。
IS NULL 和 IS NOT NULL¶
IS NULL
和 IS NOT NULL
运算符测试一个值是否为 null(未定义)。这两个运算符对所有数据类型都有效。
使用 NULL
与 IS NULL
评估为 true
select NULL IS NULL; -- true
但任何其他常量都不会
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
不同。当您比较可能包含 NULL
的值时,请使用这些运算符以保证 TRUE
或 FALSE
结果。
以下真值表展示了 IS DISTINCT FROM
和 IS NOT DISTINCT FROM
中 NULL
的处理方式
a |
b |
a = b |
a <> b |
a DISTINCT b |
a NOT DISTINCT b |
---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
量词可以与比较运算符一起使用,如下所示
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
以下是某些量词和比较运算符组合的含义
表达式 |
含义 |
---|---|
|
当 |
|
当 |
|
当 |
|
当 |
|
当 |
|
当 |
ANY
和 SOME
含义相同,可以互换使用。
LIKE¶
LIKE 运算符用于匹配字符串中指定的字符模式。 模式可以包含普通字符以及通配符。 可以使用为 ESCAPE 参数指定的单个字符转义通配符。 匹配区分大小写,并且模式必须与整个字符串匹配。
语法
expression LIKE pattern [ ESCAPE ‘escape_character’ ]
如果 pattern
或 escape_character
为空,则表达式计算结果为空。
通配符 |
表示 |
---|---|
|
百分号表示零个、一个或多个字符 |
|
下划线表示单个字符 |
示例
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'
SELECT 'ab' || chr(10) || 'c' LIKE 'ab' --chr(10) is a newline character
--returns 'false'
行比较:IN¶
SQL 中的 IN 比较运算符用于将值与指定的文字值列表进行比较。 如果该值与列表中的任何文字值匹配,则 IN 运算符返回 TRUE。 IN 运算符可以用于将值与以下模式进行比较。 它可以根据 WHERE 子句中指定的多个值来获取记录。 子查询或值列表必须在括号中指定,但子查询中必须指定一列。
WHERE column [NOT] IN ('value1','value2');
WHERE column [NOT] IN ( subquery )
示例
SELECT * FROM region WHERE name IN ('AMERICA', 'EUROPE');
SELECT * FROM region WHERE name IN ('NULL', 'AMERICA', 'EUROPE');
SELECT * FROM table_name WHERE (column1, column2) IN ((NULL, 'value1'), ('value2', 'value3'));
行比较:OR¶
OR 运算符用于根据多个条件过滤查询的结果。 如果由 OR 分隔的任何条件为 TRUE,则它返回一条记录。 子句中的值用于多个比较,这些比较组合在一起作为逻辑 OR。 前面的查询等效于以下查询
示例
SELECT * FROM region WHERE name = 'AMERICA' OR name = 'EUROPE';
行比较:NOT IN¶
SQL 中的 NOT IN 比较运算符用于排除与列表或子查询中任何值匹配的行。
可以通过添加 NOT 来否定比较,并获取除了列表中的值以外的所有其他区域
示例
SELECT * FROM region WHERE name NOT IN ('AMERICA', 'EUROPE');
使用子查询来确定用于比较的值时,子查询必须返回一列和一个或多个行。
示例
SELECT id, name FROM region WHERE name IN (SELECT name FROM region WHERE id IN (3,4));