MySQL中CASE语法规则的详细解析及扩展示例
基础CASE表达式结构
CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE default_result
END AS alias_name
嵌套COUNT+CASE的特殊用法
COUNT(CASE WHEN condition THEN 1 END)
这种结构相当于其他数据库中的COUNTIF()或SUMIF()函数。
嵌套COUNT+CASE的特殊用法
注:
博客:
霸道流氓气质-CSDN博客
业务使用示例
SELECTCASEWHEN COUNT(CASE WHEN ar.monitor_indicator = 0 AND ae.event_status = 0 THEN 1 END) = 0 THEN 2 WHEN COUNT(CASE WHEN ar.monitor_indicator = 0 AND ae.event_status = 0 AND mi.is_dispose = 0 THEN 1 END) > 0 THEN 1ELSE 0 END as dataSignalStatus,
逐层解析
外层CASE逻辑
CASE WHEN [条件A] THEN 2 WHEN [条件B] THEN 1 ELSE 0 END
这是一个典型的三态判断结构,优先级从上到下依次判断。
内层COUNT+CASE组合
条件A(判断是否未开启):
COUNT(CASE WHEN ar.monitor_indicator = 0 AND ae.event_status = 0 THEN 1 END) = 0
→计算满足"监测指标=0且事件状态=0"的记录数是否为0
条件B(判断是否异常):
COUNT(CASE WHEN ar.monitor_indicator = 0 AND ae.event_status = 0 AND mi.is_dispose = 0 THEN 1 END) > 0
→计算满足"监测指标=0且事件状态=0且未处理"的记录数是否>0
同类语法示例1:学生成绩等级划分
SELECTstudent_name,CASEWHEN COUNT(CASE WHEN score >= 90 THEN 1 END) > 0 THEN 'A'WHEN COUNT(CASE WHEN score >= 60 THEN 1 END) = 0 THEN 'C'ELSE 'B'END AS grade_level
FROM exam_results
GROUP BY student_name;
同类语法示例2:电商订单状态统计
SELECTproduct_id,CASEWHEN COUNT(CASE WHEN status = 'paid' THEN 1 END) = 0 THEN 'no_sales'WHEN COUNT(CASE WHEN status = 'refunded' THEN 1 END) > 3 THEN 'high_refund'ELSE 'normal'END AS sales_status
FROM orders
GROUP BY product_id;
同类语法示例3:设备故障监测
SELECTdevice_id,CASEWHEN COUNT(CASE WHEN sensor_type = 'temp' AND is_active = 1 THEN 1 END) = 0 THEN 2WHEN COUNT(CASE WHEN sensor_type = 'temp' AND is_active = 1 AND is_error = 1 THEN 1 END) > 0 THEN 1ELSE 0END AS temp_status
FROM device_monitoring
GROUP BY device_id;
这种嵌套条件计数的方法在状态监测、分级统计等场景非常实用,能有效减少查询次数,提升性能。