SQL中select case when的使用

本文详细介绍了SQL中CASE语句的高级用法,包括创建自定义字段、在WHERE子句中的应用以及与GROUP BY、ORDER BY结合的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE

首先让我们看一下 
CASE 的语法。在一般的 SELECT 中,其语法如下:

SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
END 

在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:

USE pubs
GO
SELECT
    Title,
    
'Price Range' =
    
CASE
        
WHEN price IS NULL THEN 'Unpriced'
        
WHEN price < 10 THEN 'Bargain'
        
WHEN price BETWEEN 10 and 20 THEN 'Average'
        
ELSE 'Gift to impress relatives'
    
END
FROM titles
ORDER BY price
GO 

这是 
CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE

SELECT 'Number of Titles'Count(*)
FROM titles
GROUP BY
    
CASE
        
WHEN price IS NULL THEN 'Unpriced'
        
WHEN price < 10 THEN 'Bargain'
        
WHEN price BETWEEN 10 and 20 THEN 'Average'
        
ELSE 'Gift to impress relatives'
    
END
GO 

你甚至还可以组合这些选项,添加一个 
ORDER BY 子句,如下所示:

USE pubs
GO
SELECT
    
CASE
        
WHEN price IS NULL THEN 'Unpriced'
        
WHEN price < 10 THEN 'Bargain'
        
WHEN price BETWEEN 10 and 20 THEN 'Average'
        
ELSE 'Gift to impress relatives'
    
END AS Range,
    Title
FROM titles
GROUP BY
    
CASE
        
WHEN price IS NULL THEN 'Unpriced'
        
WHEN price < 10 THEN 'Bargain'
        
WHEN price BETWEEN 10 and 20 THEN 'Average'
        
ELSE 'Gift to impress relatives'
    
END,
    Title
ORDER BY
    
CASE
        
WHEN price IS NULL THEN 'Unpriced'
        
WHEN price < 10 THEN 'Bargain'
        
WHEN price BETWEEN 10 and 20 THEN 'Average'
        
ELSE 'Gift to impress relatives'
    
END,
    Title
GO 

注意,为了在 
GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。

除了选择自定义字段之外,在很多情况下 
CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集

<think>好的,我现在需要帮助用户了解SQLCASE WHEN的用法,并提供示例教程。根据用户提供的引用资料,他们提到了CASE WHEN与SUM结合使用进行分段统计,以及使用CASE WHEN离散化时间段的例子。我需要确保覆盖这些内容,并且可能还需要补充其他常见用法。 首先,我应该先解释CASE WHEN的基本结构,让用户有一个整体的认识。然后分点说明不同的应用场景,比如简单条件判断、多条件分支、聚合统计、数据离散化和更新数据。每个部分都需要例子,这样用户更容易理解。 用户提供的引用[1]中,用SUM和CASE WHEN统计不同状态的数量,这可能涉及到条件聚合,这部分需要详细说明。引用[2]是关于将时间划分为不同时段,属于数据离散化的例子,这也是一个常见的用例,需要包含进去。 此外,可能需要提到在SELECT、WHERE、ORDER BY子句中使用CASE WHEN,但根据用户提供的引用,重点可能是在SELECT和聚合函数中使用,所以优先处理这些情况。同时,用户可能对更新数据时的应用感兴趣,这也是一个重要的点,应该包括进来。 需要注意示例的代码是否正确,比如在引用[2]中,原SQL的call_period比较可能使用了>和<,但如果是字符串类型,可能需要考虑是否应该用字符串比较,或者是否应该转换为数值。不过用户提供的例子中直接用了字符串比较,所以可以保留,但可能需要提醒用户注意数据类型。 另外,用户的问题是关于用法和示例教程,所以结构要清晰,分点列出,每个用法对应一个例子。可能还需要总结使用场景,帮助用户记忆。 最后,生成相关问题的时候,需要考虑用户可能的后续问题,比如性能优化、多条件处理、与其他函数的结合使用,以及常见错误。这些相关问题可以帮助用户深入学习和解决问题。</think>### SQL CASE WHEN 用法详解 CASE WHENSQL 中实现条件逻辑的核心语法,支持**条件判断、数据转换、分段统计**等功能。以下是 5 种典型用法及示例: --- #### 1. 简单条件判断 ```sql SELECT name, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 60 THEN '及格' ELSE '不及格' END AS grade FROM students; ``` **效果**:将分数映射为等级标签,输出字段包含`name`和`grade` --- #### 2. 多条件分支(离散化处理) ```sql SELECT order_id, CASE WHEN amount > 1000 THEN '大额订单' WHEN amount BETWEEN 500 AND 1000 THEN '中额订单' ELSE '小额订单' END AS order_type FROM orders; ``` **应用场景**:电商订单金额分类统计[^2] --- #### 3. 聚合统计(条件计数) ```sql SELECT SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_count, AVG(CASE WHEN department = 'IT' THEN salary END) AS it_avg_salary FROM employees; ``` **优势**:单次查询完成多维度统计,比多次子查询效率更高[^1] --- #### 4. 数据清洗(空值处理) ```sql SELECT CASE WHEN phone IS NULL THEN '未填写' ELSE phone END AS contact_info FROM users; ``` --- #### 5. UPDATE 语句动态赋值 ```sql UPDATE products SET price = CASE WHEN category = 'Electronics' THEN price * 1.1 WHEN category = 'Clothing' THEN price * 0.9 ELSE price END; ``` **功能**:按商品类别差异化调整价格 --- ### 进阶技巧 1. **嵌套使用**:可在 CASE WHEN 中嵌套其他函数 ```sql CASE WHEN LENGTH(TRIM(address)) > 0 THEN address END ``` 2. **类型一致性**:所有 THEN 子句返回值类型必须相同 3. **性能优化**:将高频触发的条件放在前面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值