2026-02-11 17
CASE WHEN是 SQL 中的条件判断语句,类似 PHP 里的if-else或switch,用于在查询结果中根据条件动态生成值。它和 PHP 是 “协作关系”:PHP 负责拼接 / 执行 SQL,CASE WHEN负责在数据库层面做条件逻辑。
注意:COUNT()会忽略NULL值
用法示例:
CASE 字段名
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
ELSE 默认结果
END
SELECT
id,
username,
CASE status
WHEN 0 THEN '禁用'
WHEN 1 THEN '正常'
WHEN 2 THEN '待审核'
ELSE '未知状态'
END AS status_text
FROM user;
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 默认结果
END
SELECT
id,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS level
FROM exam;
// 假设已连接数据库,$conn是mysqli连接对象
$sql = "
SELECT
COUNT(DISTINCT V.f_openid) as total_visitor,
-- 统计转化数:P.p_openid存在则计数
COUNT(CASE WHEN P.p_openid IS NOT NULL THEN V.f_openid END) as zh_sum,
-- 统计实名转化数:P.is_ok=1才计数
COUNT(CASE WHEN P.is_ok = 1 THEN V.f_openid END) as smzh_sum
FROM `visitor_info` V
LEFT JOIN patient_info P ON V.f_openid = P.p_openid
";
// PHP执行SQL并获取结果
$result = $conn->query($sql);
$summary = $result->fetch_assoc();
// 输出结果(PHP处理SQL返回的CASE WHEN统计结果)
echo "总访客数:" . $summary['total_visitor'] . "";
echo "转化数:" . $summary['zh_sum'] . "";
echo "实名转化数:" . $summary['smzh_sum'] . "";
另外:聚合函数:除了COUNT,还能和SUM/AVG等配合...
防止 SQL 注入:如果CASE WHEN的条件包含 PHP 变量,一定要用预处理语句
// 错误示例(有注入风险)
$sql = "CASE WHEN status = '$status' THEN ... END";
// 正确示例(预处理)
$stmt = $conn->prepare("SELECT CASE WHEN status = ? THEN '有效' ELSE '无效' END AS status_text FROM user");
$stmt->bind_param("s", $status);
$stmt->execute();
总结
CASE WHEN是SQL 语法,不是 PHP 语法,核心作用是在数据库层面做条件判断,减少 PHP 后续处理的工作量。
常用两种形式:简单 CASE(匹配固定值)、搜索 CASE(复杂条件),后者更灵活,是实战中的首选。
PHP 中使用时,重点是把条件逻辑写在 SQL 里,执行后直接获取处理后的结果,同时注意预处理防止注入。
核心优势:减少数据库查询次数、降低 PHP 运算量、提升整体性能(尤其统计场景)。

