比较运算
Comparison Operators
下表展示了标准比较运算符。
当任一输入参数为 NULL 时,比较结果为 NULL。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
< | 小于 | 2 < 3 | true |
> | 大于 | 2 > 3 | false |
<= | 小于或等于 | 2 <= 3 | true |
>= | 大于或等于 | 4 >= NULL | NULL |
= or == | 等于 | NULL = NULL | NULL |
<> or != | 不等于 | 2 <> 2 | false |
下表展示了标准的区分运算符。
这些运算符会将 NULL 视为相等。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
IS DISTINCT FROM | 不相等(包含 NULL) | 2 IS DISTINCT FROM NULL | true |
IS NOT DISTINCT FROM | 相等(包含 NULL) | NULL IS NOT DISTINCT FROM NULL | true |
Combination Casting
当比较不同类型时,Goose 会执行组合类型转换。
该转换机制是为了让交互式查询更方便,其行为与多种编程语言的转换规则一致,但通常与 PostgreSQL 的行为不兼容。例如,以下表达式在 Goose 中会成功计算并返回 true,但在 PostgreSQL 中会报错。
SELECT 1 = true;
SELECT 1 = '1.1';
Goose 的比较运算符无法强制启用更严格的类型检查。如果你需要更严格的类型检查,可考虑结合
typeof函数创建 macro,或实现用户自定义函数。
BETWEEN and IS [NOT] NULL
除标准比较运算符外,还有 BETWEEN 与 IS (NOT) NULL 运算符。它们在行为上类似普通运算符,但语法由 SQL 标准特别规定,如下表所示。
请注意,只有在 a、x、y 三者类型相同的情况下,BETWEEN 与 NOT BETWEEN 才与下方示例等价,因为 BETWEEN 会将所有输入转换为同一类型。
| 谓词 | 说明 |
|---|---|
a BETWEEN x AND y | 等价于 x <= a AND a <= y |
a NOT BETWEEN x AND y | 等价于 x > a OR a > y |
expression IS NULL | 若表达式为 NULL 则为 true,否则为 false |
expression ISNULL | IS NULL 的别名(非标准) |
expression IS NOT NULL | 若表达式为 NULL 则为 false,否则为 true |
expression NOTNULL | IS NOT NULL 的别名(非标准) |
对于表达式
BETWEEN x AND y,x是下界,y是上界。因此若x > y,结果始终为false。