SQL中的CASE WHEN语句

本文详细介绍了SQL CASE WHEN语句的用法,并通过实例展示了如何使用此语句简化复杂查询,包括性别转换、统计数据汇总等场景。此外,文章还讨论了CASE WHEN语句在不同情况下的语法变化及其实例应用。

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

今天.NET新手群中有人出了这样一道面试题:

一张表数据如下
1900-1-1
1900-1-1
1900-1-1
1900-1-2
1900-1-2
写出一条SQL语句,使检索结果如下:
           
1900-1-1 2   1
1900-1-2 2   0

我随手建了这样一个表:

create table test(Date varchar(50) null, Result varchar(50) null)

并将上面的数据都插入到表中。

经过一番尝试和修改,终于得到了答案:

select distinct Date,
sum(case Result when '胜' then 1 else 0 end) as '胜',
sum(case Result when '负' then 1 else 0 end) as '负'
from test
group by date

这里我要说的,其实是SQL中case when的用法。它在普通的SQL语句中似乎并不常见,我本人以前也没在实际项目中使用过。遇到类似问题,往往通过代码或多条SQL语句实现。或者是如下这种丑陋的SQL,并且还伴随着很多潜在的BUG(如,当没有‘负’时)。

select a.date,a.a1 ,b.b1  from 
(select date,count(date) a1 from test where Result ='胜' group by date) a, 
(select date,count(date) b1 from test where Result ='负' group by date) b 
where a.date=b.date

我们不妨来复习一下CASE WHEN的语法。

CASE WHEN有两种用法,一种是类似上面例子中那样的简单CASE函数:

CASE result
    WHEN '胜' THEN 1
    WHEN '负' THEN 2
ELSE 0
END

还有一种是CASE搜索函数:

CASE WHEN result='胜' THEN 1
     WHEN result='负' THEN 2
ELSE 0
END

其中result='胜'可以替换为其他条件表达式。如果有多个CASE WHEN表达式符合条件,将只返回第一个符合条件的子句,其余子句将被忽略。

用CASE WHEN语句可以简化我们平时工作中遇到的很多问题。如性别在表中存的是数字1、2,但是希望查询出来男、女时,可以这样:

select (case Gender when 1 then '男' when 2 then '女' else '其他' end) as Gender from Table1

是不是很强大呢?


http://www.cnblogs.com/kirinboy/archive/2010/01/11/1644108.html

### 使用方法 SQL中的`CASE WHEN`语句是一种条件表达式,它允许在SQL查询中执行条件逻辑。这种语句可以用于SELECT列表、WHERE子句、ORDER BY子句等地方,以实现更灵活的数据处理。 #### 基本语法结构 ```sql CASE WHEN condition1 THEN result1 [WHEN condition2 THEN result2] ... [ELSE resultN] END ``` 这里的`condition`是任何有效的SQL表达式,而`result`是在对应的`condition`为真时返回的值。如果没有任何条件匹配,则返回`ELSE`后面的值;如果没有提供`ELSE`部分且没有条件匹配,则返回NULL。 ### 示例 ##### 实例一:统计每日胜负次数 假设有一张表记录了比赛的结果,字段包括日期和比赛结果(胜或负)。目标是统计每个日期的胜利和失败次数: ```sql SELECT date, COUNT(CASE WHEN result = '胜' THEN 1 ELSE NULL END) AS 胜, COUNT(CASE WHEN result = '负' THEN 1 ELSE NULL END) AS 负 FROM matches GROUP BY date; ``` 此查询通过`CASE WHEN`语句分别统计了每一天的比赛胜利次数和失败次数[^1]。 ##### 实例二:转换性别字段 在数据库中,性别可能以数字形式存储(例如1代表男性,0代表女性),但在查询结果中希望显示为汉字: ```sql SELECT name, (CASE gender WHEN 1 THEN '男' WHEN 0 THEN '女' END) AS gender FROM students; ``` 这个例子展示了如何使用`CASE WHEN`语句来转换性别字段的显示方式[^3]。 ##### 实例三:分类评价 对于特定的人物列表,根据名字给予不同的评价: ```sql SELECT fname, (CASE fname WHEN 'tom' THEN '好孩子' WHEN 'jack' THEN '坏孩子' ELSE '普通孩子' END) AS isgoodchild FROM T_person; ``` 此例中,`CASE WHEN`被用来根据人物的名字分配不同的评价标签[^4]。 ### 注意事项 - `CASE WHEN`语句中的各个分支的结果类型应该保持一致,否则可能会导致类型转换错误。 - `ELSE`部分是可选的,但如果省略且没有条件匹配,结果将是NULL。 - 在使用`CASE WHEN`进行聚合操作时,通常需要结合`COUNT()`、`SUM()`等聚合函数一起使用。 以上就是关于SQL中`CASE WHEN`语句的基本用法和一些示例。通过这些例子,可以看到`CASE WHEN`的强大之处在于它能够在查询中引入条件逻辑,从而使得数据处理更加灵活多变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值