跳到主要内容

比较函数和操作符

比较表达式产生布尔结果,通常用于 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。