写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上, 所以实战中如果碰到维护较好的表, 我相信这两个函数的耗时区别几乎可以忽略不计.
所以到底应该用哪个的结论是:
...
...
看! 心! 情!