比较函数和运算符

本页说明 Polars SQL 中可用的比较行为。

比较运算符

运算符

说明

<

小于

>

大于

<=

小于或等于

>=

大于或等于

=

等于

<>

不等于

!=

不等于(非标准但常用的语法)

范围运算符: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 参数在 Polars SQL 类型强制转换后必须能够相互比较。

IS NULL 和 IS NOT NULL

IS NULLIS 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 的比较都会产生 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

LIKE

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

语法:

expression LIKE pattern [ ESCAPE 'escape_character' ]

如果 patternescape_character 为 null,则表达式求值为 null。

通配符

表示形式

%

百分号表示零个、一个或多个字符

_

下划线表示单个字符

示例:

 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 子句中指定的多个标量值获取记录。子查询或值列表必须放在括号中。与 IN 一起使用的子查询必须只返回一列。

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');

作为 OR 的 IN

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));