好问题 👍
在 标准 SQL 和 MySQL 中,
CASE WHEN ... THEN ... 的 THEN 后面 不能直接写一个普通的 SELECT 语句。
THEN 后面必须是一个**返回单个值(标量)**的表达式。
🚫 错误示例(不能这样写)
这在 MySQL 中会报错:
✅ 正确写法(但有条件)
如果你希望根据条件去查询子表的值,
你可以在 THEN 后面放一个 子查询(scalar subquery),
只要这个子查询保证 只返回一个值。
✅ 例如:
✔ 要点:
-
子查询必须只返回 一行一列;
-
否则会报错:
ERROR 1242 (21000): Subquery returns more than 1 row
⚡️性能建议
虽然这样写是合法的,但如果数据量大,性能会很差(每行执行一次子查询)。
更推荐使用 JOIN + CASE 的方式:
✅ 总结表
| 场景 | 是否允许 | 说明 |
|---|---|---|
THEN 后是常量或表达式 |
✅ | 常规写法 |
THEN 后是返回单值的子查询 |
✅ | 合法但要保证只返回一行 |
THEN 后是返回多行的子查询 |
❌ | 会报错 |
| 想返回关联表字段 | ✅(推荐JOIN) | 性能更好,可读性更强 |

浙公网安备 33010602011771号