比较函数和运算符

比较运算符

运算符

描述

<

小于

>

大于

<=

小于或等于

>=

大于或等于

=

等于

<>

不等于

!=

不等于(非标准但流行的语法)

范围运算符: 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;

BETWEENNOT BETWEEN 语句中存在 NULL 会导致语句评估为 NULL

SELECT NULL BETWEEN 2 AND 4; -- null

SELECT 2 BETWEEN NULL AND 6; -- null

BETWEENNOT BETWEEN 运算符也可以用于评估字符串参数

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

请注意,BETWEENNOT BETWEEN 的 value、min 和 max 参数必须是相同类型。例如,如果您要求 Presto 判断 John 是否在 2.3 到 35.2 之间,Presto 会产生错误。

IS NULL 和 IS NOT NULL

IS NULLIS NOT NULL 运算符测试一个值是否为 null(未定义)。这两个运算符对所有数据类型都有效。

使用 NULLIS NULL 评估为 true

select NULL IS NULL; -- true

但任何其他常量都不会

SELECT 3.0 IS NULL; -- false

IS DISTINCT FROM 和 IS NOT DISTINCT FROM

在 SQL 中,NULL 值表示一个未知值,因此任何包含 NULL 的比较都会产生 NULLIS DISTINCT FROMIS 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 的值时,请使用这些运算符以保证 TRUEFALSE 结果。

以下真值表展示了 IS DISTINCT FROMIS NOT DISTINCT FROMNULL 的处理方式

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, ANYSOME 量词可以与比较运算符一起使用,如下所示

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 (...)

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 含义相同,可以互换使用。

LIKE

LIKE 运算符用于匹配字符串中指定的字符模式。 模式可以包含普通字符以及通配符。 可以使用为 ESCAPE 参数指定的单个字符转义通配符。 匹配区分大小写,并且模式必须与整个字符串匹配。

语法

expression LIKE pattern [ ESCAPE ‘escape_character’ ]

如果 patternescape_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));