ZhangZhihui's Blog  

好问题 👍

标准 SQLMySQL 中,
CASE WHEN ... THEN ...THEN 后面 不能直接写一个普通的 SELECT 语句
THEN 后面必须是一个**返回单个值(标量)**的表达式。


🚫 错误示例(不能这样写)

SELECT
  CASE WHEN status = 'A' THEN (SELECT name FROM users WHERE id = 1)
       ELSE 'unknown'
  END AS result
FROM your_table;

 

这在 MySQL 中会报错:

ERROR 1241 (21000): Operand should contain 1 column(s)

 


✅ 正确写法(但有条件)

如果你希望根据条件去查询子表的值,
你可以在 THEN 后面放一个 子查询(scalar subquery)
只要这个子查询保证 只返回一个值

✅ 例如:

SELECT
  CASE
    WHEN status = 'A' THEN (SELECT u.name FROM users u WHERE u.id = t.user_id)
    ELSE 'unknown'
  END AS user_name
FROM your_table t;

 

✔ 要点:

  • 子查询必须只返回 一行一列

  • 否则会报错:
    ERROR 1242 (21000): Subquery returns more than 1 row


⚡️性能建议

虽然这样写是合法的,但如果数据量大,性能会很差(每行执行一次子查询)。
更推荐使用 JOIN + CASE 的方式:

SELECT
  CASE
    WHEN t.status = 'A' THEN u.name
    ELSE 'unknown'
  END AS user_name
FROM your_table t
LEFT JOIN users u ON u.id = t.user_id;

 


✅ 总结表

场景是否允许说明
THEN 后是常量或表达式 常规写法
THEN 后是返回单值的子查询 合法但要保证只返回一行
THEN 后是返回多行的子查询 会报错
想返回关联表字段 ✅(推荐JOIN) 性能更好,可读性更强

 

posted on 2025-10-29 10:14  ZhangZhihuiAAA  阅读(10)  评论(0)    收藏  举报