有需求联系

Information

- 信息浏览 -

SQL条件判断语句CASE WHEN

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 运算量、提升整体性能(尤其统计场景)。

Copyright © 2026 镇江小蚂蚁信息科技有限公司 All Rights Reserved.