比较函数和操作符
比较表达式产生布尔结果,通常用于 WHERE、JOIN ... ON 和 CASE。以下示例使用 PostgreSQL;比较之前先确认两边的类型、排序规则以及是否可能为 NULL。
基本比较
| 表达式 | 含义 | 示例结果 |
|---|---|---|
a = b、a <> b | 相等、不等 | 2 <> 3 为真 |
a < b、a <= b | 小于、小于等于 | 2 <= 2 为真 |
a > b、a >= b | 大于、大于等于 | 3 > 2 为真 |
!= 在 PostgreSQL 中也表示不等,但推荐使用标准写法 <>。字符串的大小顺序受排序规则影响,不能把字典序当作数字大小:'10' < '2' 与 10 < 2 不是同一种比较。日期和时间比较还要留意数据类型与时区。
空值与确定的比较结果
普通比较只要一侧为 SQL NULL,结果通常也是未知(SQL NULL),而不是假:
SELECT NULL = NULL AS ordinary,
NULL IS NULL AS missing,
NULL IS NOT DISTINCT FROM NULL AS null_safe_equal;
-- ordinary: NULL;missing、null_safe_equal: true
IS DISTINCT FROM 把两个 NULL 视为相同,可用于空值安全的不等比较;IS NOT DISTINCT FROM 则用于空值安全的相等比较。IS TRUE、IS FALSE、IS UNKNOWN 可以明确检查三值逻辑,例如 NULL::boolean IS UNKNOWN 为真。不要用 = NULL 判断缺失值。
集合与区间
SELECT 5 BETWEEN 2 AND 5, 5 IN (3, 5, 7);
-- 都为 true
BETWEEN low AND high 包含两个端点,相当于 value >= low AND value <= high;若端点写反不会自动交换。IN 表示与候选值之一相等。NOT IN 遇到未匹配且列表含 NULL 时会得到未知:2 NOT IN (1, NULL) 不是 TRUE。对子查询做反向筛选时,通常优先考虑 NOT EXISTS,并检查关联条件。
其他常见谓词
SELECT 2 BETWEEN SYMMETRIC 5 AND 1, 4 IS NOT DISTINCT FROM 4;
BETWEEN SYMMETRIC 允许端点倒序。GREATEST(3, 7, 5) 与 LEAST(3, 7, 5) 分别取最大、最小值;在 PostgreSQL 中忽略 NULL 参数,所有参数均为 NULL 时才返回 NULL,这一点与部分数据库不同。它们是表达式,不是跨多行汇总的聚合函数 MAX、MIN。
使用建议
- 比较不同类型时显式转换到符合业务含义的类型,避免隐式转换改变结果或索引使用情况。
- 需要“包含开始、不包含结束”的时间段时,写
created_at >= start_at AND created_at < end_at,不要直接用闭区间BETWEEN。 - 对浮点计算结果不宜直接用
=检查数学意义上的相等;精确金额优先使用numeric。