CASE WHEN 和 CASE 字段 WHEN 的区别

CASE WHEN 和 CASE xxx WHEN 是两种不同的条件表达式语法,它们的主要区别和适用场景如下:

1. 语法区别

a. 简单 CASE(CASE xxx WHEN
CASE expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE default_result
END
  • 执行逻辑:先计算 expression 的值,然后依次与每个 WHEN 后的 value 进行等值比较=)。
  • 示例
    CASE bapprove
        WHEN 1 THEN '已提交'
        WHEN 2 THEN '已通过'
        ELSE '其他'
    END

    等价于:bapprove = 1 ? '已提交' : (bapprove = 2 ? '已通过' : '其他')

 b. 搜索 CASE(CASE WHEN

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END
  • 执行逻辑:依次判断每个 WHEN 后的 condition 是否为真(TRUE),并返回第一个为真的结果。
  • 示例
    CASE
        WHEN bapprove = 1 THEN '已提交'
        WHEN bapprove = 2 AND created_at > '2023-01-01' THEN '已通过'
        ELSE '其他'
    END

  • 可以使用更复杂的条件(如比较运算符、函数等)。

 

2. 核心差异

特性简单 CASE (CASE xxx WHEN)搜索 CASE (CASE WHEN)
比较方式仅支持等值比较=支持任意条件表达式(如 ><LIKE
性能表达式只需计算一次,可能略快每个条件都需单独计算
灵活性只能针对单个表达式进行判断可组合多个字段、函数进行复杂判断
常见错误CASE bapprove WHEN bapprove = 2 THEN ...无特殊陷阱

 

3. 适用场景

简单 CASE 的适用场景
  • 等值转换:将枚举值映射为文本描述。

    SELECT 
        user_id,
        CASE gender
            WHEN 1 THEN '男'
            WHEN 2 THEN '女'
            ELSE '未知'
        END AS gender_text
    FROM users;
  • 简化多条件等值判断:避免重复书写同一字段。

UPDATE products
SET price = CASE category_id
    WHEN 1 THEN price * 1.1  -- 电子产品提价10%
    WHEN 2 THEN price * 0.9  -- 图书降价10%
    ELSE price
END;
搜索 CASE 的适用场景

总结

  • 范围判断:根据数值范围返回不同结果。

    SELECT 
        score,
        CASE
            WHEN score >= 90 THEN '优秀'
            WHEN score >= 80 THEN '良好'
            WHEN score >= 60 THEN '及格'
            ELSE '不及格'
        END AS grade
    FROM exam_results;
  • 复杂条件组合:结合多个字段或函数进行判断。

    SELECT 
        order_id,
        CASE
            WHEN status = 'paid' AND DATEDIFF(NOW(), create_time) > 30 THEN '已逾期'
            WHEN status = 'pending' THEN '待支付'
            ELSE '已完成'
        END AS order_status
    FROM orders;
  • 条件聚合:在 SUMCOUNT 等聚合函数中使用。

    SELECT
        COUNT(*) AS total_orders,
        SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_orders,
        SUM(CASE WHEN amount > 1000 THEN 1 ELSE 0 END) AS high_value_orders
    FROM orders;
  • 优先使用搜索 CASE:当需要复杂条件或非等值判断时。
  • 使用简单 CASE:当只需对单个字段进行等值映射时,可简化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值