T-SQL中的IIF和CASE WHEN语句该用谁?

浏览: 1689

写SQL程序的时候经常会遇到一种情况, 比如有一个变量叫@GENDER, 是个bit类型, 如果它的值是0, 就输出FEMALE, 若是1, 则输出MALE. 要做到这个在SQL中有两个函数最常用, 就是IIF和CASE WHEN. 而这个例子写起来是这样的

IIF

declare @gender bit
set @gender = checksum(newid())%2 --使用newid和checksum配合生成随机数
select iif(@gender=0 ,'Female','Male')

CASE WHEN

declare @gender bit
set @gender = checksum(newid())%2
select case when @gender =0 then 'Female' else 'Male' end

那么, 他们有什么不同呢? 什么情况下用哪个函数又该怎么决定?

首先, IIF只在SQL SERVER 2012以及后续版本才支持, 如果你还在用08甚至05, 还是玩case when吧.

第二, 当然是性能, 我做了个测试, 把上例中的数据量增加到1000000行来判断和输出男女, 代码如下:


create table #tbl
(
gender bit
)

----------------------------------------------
declare @i int
set @i = 1

while @i <=1000000
BEGIN
insert into #tbl (gender)
values
(
checksum(newid())%2
)

set @i = @i+1
END
----------------------------------------------
select iif(gender=0, 'female', 'male') from #tbl
--27 seconds

select case when gender=0 then 'female' else 'male' end from #tbl
--25 seconds

结果显示case when要稍好一些, 不过考虑到这个临时表本身没有索引, 执行计划显示大部分时间都花在table scan上, 所以实战中如果碰到维护较好的表, 我相信这两个函数的耗时区别几乎可以忽略不计.

所以到底应该用哪个的结论是: 

...

...

看! 心! 情!

ScreenCapture-201612041847-8.png

推荐 0
本文由 Naralee 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册