mysql普通查询中无if...else语句,可用if()函数实现二选一,或用case表达式处理多分支;if()适用于简单布尔判断,case更安全、可扩展且支持null显式处理。

MySQL 里没有 IF...ELSE 语句(那是存储过程里用的),但你完全可以在普通查询中实现等效逻辑——核心就两个:用 IF() 函数做二选一,或用 CASE 表达式做多分支判断。选哪个,取决于你要处理的条件复杂度和可读性需求。
什么时候该用 IF() 函数
IF() 是 MySQL 特有的三元运算函数,适合简单、明确的“是/否”判断。它写起来快,但嵌套三层以上就容易出错,也不利于后期维护。
- 只适用于单个布尔条件,比如
salary > 5000、status = 1 - 当
condition为NULL时,IF()一律走value_if_false分支(不是报错,而是隐式当作 FALSE) - 返回值类型由两个分支值决定:如果一个是字符串、一个是数字,MySQL 会尝试转成字符串(如
IF(1>0, 'ok', 123)返回'ok',但IF(1>0, 123, 'ok')也可能返回'123') - 示例:
SELECT name, IF(age >= 18, '成年', '未成年') AS age_group FROM users;
为什么 CASE 更值得优先考虑
绝大多数业务场景下,CASE 比 IF() 更安全、更清晰、更易扩展。它天然支持多条件、范围判断、NULL 显式处理,且在所有主流 SQL 方言中语法一致(迁移成本低)。
- 搜索型
CASE(带WHEN condition THEN ...)可自由组合AND/OR,比如:WHEN gender = '女' AND age > 30 THEN '资深女性用户' - 条件按顺序匹配,遇到第一个为 TRUE 的
WHEN就停止,所以范围判断要从高到低写(如先>= 1000,再BETWEEN 500 AND 999) -
ELSE不写会返回NULL,建议显式补上(哪怕只是ELSE '其他'),避免前端展示空值 - 可直接用于
WHERE子句做动态过滤,但注意:不能在WHERE里用别名,得重复整个CASE表达式 - 示例:
SELECT order_id, CASE WHEN amount >= 1000 THEN '高价值' WHEN amount >= 500 THEN '中等价值' ELSE '普通' END AS level FROM orders;
IFNULL() 和 NULLIF() 是什么角色
它们不是 IF-ELSE 的替代品,而是专门处理 NULL 的辅助函数,常和 IF 或 CASE 配合使用。
-
IFNULL(expr1, expr2):只判断expr1是否为NULL,是则返回expr2;注意空字符串''、数字0都不算NULL,不会触发替换 -
NULLIF(expr1, expr2):当expr1 = expr2时返回NULL,否则返回expr1;常用于把特定值“抹掉”,比如把状态码'N/A'转成NULL再统一处理 - 别混淆
IFNULL()和IF():前者只认NULL,后者认所有布尔假值(0、''、NULL) - 示例:
SELECT IFNULL(phone, '未提供') AS contact, NULLIF(status, 'pending') AS clean_status FROM users;
真正容易被忽略的是:CASE 在 GROUP BY 或窗口函数里也能用,而 IF() 在某些旧版 MySQL 中可能不支持出现在这些上下文中;另外,所有这些函数在 WHERE 里使用时,若涉及字段计算,可能影响索引使用——别只顾着写逻辑,忘了看执行计划。










