sign函数返回-1、0、1,简洁支持正负零判断,null输入返回null,mysql/pg/sql server原生支持,sqlite需case模拟,适用于分组统计与复合条件筛选。

SIGN 函数直接返回 -1、0、1,比写 CASE WHEN value > 0 THEN 1 ... 简洁得多,且在 WHERE 或 ORDER BY 中可直接用。
SQL 的 SIGN 函数返回值规则
SIGN 接收一个数值表达式,返回整数:
- 负数 →
-1 - 零 →
0 - 正数 →
1
注意:NULL 输入会返回 NULL,不是 0;浮点数、DECIMAL、整型都支持。MySQL、PostgreSQL、SQL Server 都支持该函数,但 SQLite 不原生支持(需用 CASE 模拟)。
在 WHERE 条件中快速筛选正/负数
比起 WHERE amount > 0 这种写法,SIGN 更适合“分类判断”场景,比如同时抓出正数和负数做分组统计:
SELECT SIGN(balance) AS sign_group, COUNT(*) FROM accounts GROUP BY SIGN(balance);
常见错误是误以为 SIGN(balance) = 1 比 balance > 0 快——其实二者执行计划通常一致,但 SIGN 在复合条件里更清晰,例如:
- 查所有“余额为正但未满 100”的记录:
WHERE SIGN(balance) = 1 AND balance - 排除零值和空值:
WHERE SIGN(COALESCE(value, 0)) != 0(注意COALESCE防NULL)
SIGN 和 ORDER BY 配合实现符号优先排序
想让负数排前面、正数排后面、零居中?直接用 SIGN 当排序键最直觉:
SELECT * FROM transactions ORDER BY SIGN(amount), ABS(amount);
这里 SIGN(amount) 把行分为三组(-1 → 0 → 1),再用 ABS(amount) 组内升序。容易踩的坑:
- 别写成
ORDER BY SIGN(amount) DESC期望负数在后——-1 DESC反而排最前 - PostgreSQL 中若字段含
NaN(如 float 类型异常值),SIGN(NaN)行为未定义,建议先过滤
真正要注意的是数据库兼容性:如果代码要跨 MySQL/PG/SQL Server 运行,SIGN 是安全的;一旦涉及 SQLite 或旧版 SQL Server(2005 以前),就得 fallback 到 CASE WHEN x > 0 THEN 1 WHEN x ——这个细节常被忽略,上线前最好查下目标环境手册。










