跳到主要内容

PostgreSQL WHERE 条件过滤教程

WHERE 子句在读取数据后、分组前对行进行过滤,是使用频率最高的 SQL 组件。本篇系统梳理条件表达式的写法与常见陷阱。

本篇内容​

  • 比较运算符与逻辑组合(AND / OR / NOT)
  • IN、BETWEEN、LIKE / ILIKE、IS NULL
  • 运算符优先级与括号
  • NULL 参与比较的特殊性

比较与逻辑组合​

SELECT id, name, age, status FROM users
WHERE age >= 18 AND status = 1;

-- 括号改变优先级:(a OR b) AND c
SELECT id, name FROM users
WHERE (status = 1 OR status = 2) AND age < 30;

常用条件运算符​

-- IN:多值匹配(等价于 OR 的集合形式)
SELECT id, name FROM users WHERE status IN (1, 2, 3);

-- BETWEEN:闭区间,包含两端
SELECT id, amount FROM orders WHERE amount BETWEEN 100 AND 1000;

-- LIKE:% 匹配任意长度,_ 匹配单个字符
SELECT id, name FROM users WHERE name LIKE '张%';
-- ILIKE:忽略大小写
SELECT id, name FROM users WHERE email ILIKE '%@example.com';

NULL 判断​

-- NULL 只能用 IS NULL / IS NOT NULL 判断
SELECT id, name FROM users WHERE deleted_at IS NULL;
-- ❌ = NULL 永远不成立,不会匹配任何行
待补充(TODO)
  • 补充:LIKE 模式中的特殊字符转义(% 和 _ 作为字面量)
  • 补充:三值逻辑表(TRUE / FALSE / NULL 组合的结果)与 NOT IN 遇 NULL 的陷阱
  • 补充:正则匹配(~ / ~* / SIMILAR TO)与全文检索的边界
  • 补充:条件列的选择性与索引使用的关系(哪些 WHERE 能走索引)