PostgreSQL Operators 运算符实用教程
本教程按数据类型分类介绍 PostgreSQL 常用运算符。运算符的含义由操作数类型决定;同一个符号(例如 +、@>)可能在不同类型上代表不同操作。
运算符速览
| 类型类别 | 常见运算符 | 示例用途 |
|---|---|---|
| 通用比较与逻辑 | =、<>、<、AND、OR、IS NULL | 筛选、组合条件 |
| Numeric 数值 | +、-、*、/、%、^ | 算术计算 |
| Character / Text | ` | |
| Date/Time | +、-、比较 | 日期偏移、时间差 |
| ARRAY | @>、<@、&&、= | 包含、重叠、相等 |
| JSONB | ->、->>、@>、? | 提取、包含、键存在性 |
| Range | @>、<@、&&、* | 包含、重叠、交集 |
| Network / Bit string | <<、>>、&、` | ` |
| 全文搜索 | @@、&&、` |
通用比较、NULL 与逻辑运算
大多数标量类型可用比较运算符。布尔条件支持 AND、OR、NOT;NULL 使用三值逻辑,因此普通比较遇到 NULL 会得到 unknown(在 WHERE 中不会被选中)。
SELECT 10 = 10;
-- true
SELECT 10 <> 3;
-- true
SELECT NULL = NULL;
-- NULL,不是 true
SELECT * FROM users WHERE email IS NOT NULL AND (status = 'active' OR is_admin IS TRUE);
-- NULL 安全的相等判断
SELECT NULL IS NOT DISTINCT FROM NULL;
-- true
IS DISTINCT FROM 和 IS NOT DISTINCT FROM 把 NULL 当作可比较状态,适合需要 NULL 安全相等判断的场景。集合比较还可使用 IN、ANY、ALL。
SELECT 3 IN (1, 3, 5);
-- true
SELECT 3 = ANY (ARRAY[1, 3, 5]);
-- true
SELECT 3 < ALL (ARRAY[5, 8, 10]);
-- true
注意
NOT IN 的集合中若包含 NULL,结果可能是 NULL 而不是 true。对可空子查询,通常用 NOT EXISTS 表达“没有匹配行”更清晰。
Numeric:数值运算符
整数、精确数值和浮点数共享常见算术符号,但除法和精度行为取决于操作数类型。
SELECT 7 + 2, 7 - 2, 7 * 2;
SELECT 7 / 2;
-- integer 除法:3
SELECT 7::numeric / 2;
-- numeric 除法:3.5
SELECT 7 % 2;
-- 取余:1
SELECT 2 ^ 3;
-- 幂运算(numeric / float 类型)
SELECT 5 !;
-- 阶乘(numeric)
-- 比较数值大小
SELECT 10.25::numeric > 9.99::numeric;
信息
金额计算一般使用 numeric。浮点数比较受近似表示影响,不要假设复杂运算结果总能精确相等。需要截断或取整时,应明确选择 round、trunc、floor 或 ceil 等函数。