sql学习之CASE WHEN THEN ELSE END的用法
超强:SQL命令中的case...when...then...else...end条件查询(不同于where)与类型转换的用法
case...when...then...else...end,是在from前面,可以改变记录中某字段的值,不能决定是否显示该记录;
where,是在from后面,不可以改变记录中某字段的值,但可以决定是否显示该记录。
case...when...then...else...end,可用于对同一记录的多个字段求和,带分支判断。
另外,对字段判断和处理,往往需要强制类型转换。
selectto_number('19f','xxx')fromdual;--八进制
得到 415
selectto_number('f','xx')fromdual;--十六进制
得到 15
selectto_number('123') fromdual;--十进制
得到 123
与date操作关系最大的就是两个转换函数:to_date(),to_char()
to_date()作用将字符类型按一定格式转化为日期类型:
具体用法:to_date('2004-11-27','yyyy-mm-dd'),
前者为字符串,后者为转换日期格式,注意,前后两者要以一对应。如to_date('2004-11-2713:34:43','yyyy-mm-ddhh24:mi:ss')将得到具体的时间
字符串处理函数:
selectto_number(SUBSTR(rain_1,0,2),'xx') fromobs
(一)Access数据库
大家知道在access中有iif函数,能将一个判断赋值序列简化成一个表达式,比如
iif(a>b,1,2),如果确实a>b那么结果给出1,否则就是2。这实在很方便。
示例
(1)数字
如果Measures.CurrentMember是空单元,则下面的示例返回0,否则返回1
IIf(IsEmpty(Measures.CurrentMember),0,1)
(2)字符串
如果Measures.CurrentMember是空单元,则下面的字符串返回字符串"Yes",否则返回字符串"No"
IIf(IsEmpty(Measures.CurrentMember),"Yes","No")
在Access中我可以用IIF函数进行统计汇总,比如,要知道实际应该交费的用户个数
Access写法:Selectsum(iif(金额>0,1,0))asnumfrom费用
MSSQL写法:selectsum(casewhen金额>0then1else0end)asnumfrom费用
(二)MsSQL数据库
IIF在SQL中是casewhen....then...else... end
例:selectid,casewhenbz='1'thenxxwhenbz='2'thenyyelsezzendasttfromxxx
这里我举个例子,有一个表政策法规表(policy_fgxx),有ID(主键)、bzh(标准号)、zynr(主要内容)、
fbrq(发布日期)四个字段
Select*Frompolicy_fgxx结果:
IDbzhzynrfbrq
13001<p>你好</p>2010-05-070:00:00
15NULL
我不想要上面的结果,我想要下面这个结果:
IDbzhzynrfbrq
13001<p>你好</p>2010-05-070:00:00
15无1990-06-060:00:00
也就是说,标准号为空的时候我想让它显示空,发布日期为null的时候我想让它显示我指定的日期
下面我给出写法,大家可以自己思考
Selectid,zynr, (casewhenbzh=''then'无'elsebzhend)ASbzh, (casewhenfbrqisnullthen'1982-06-02'elsefbrqend)ASfbrq Frompolicy_fgxx
sqlitecasewhenthenelseend
sqlite>selectdatetime(CreateTime,'unixepoch','localtime')时间,Message内容,caseDeswhen0then'乐'else'园'end名称 fromChat_af863d30e1c1e5eba27a0df37a75dba0whererowid<=2; +---------------------+----------+------+ |时间|内容|名称| +---------------------+----------+------+ |2013-08-2218:54:13|网络不好|园| |2013-08-2220:19:07|乔乐|园| +---------------------+----------+------+ 2rowsinset
其它网友的实例:
Id name dept
1 aa dept1
2 bb dept1
3 cc dept2
SELECTSUM(CASEdecpWHEN'decp1'THEN1ELSE0end)ASdecp1,
sum(casedecpwhen'decp2'then1else0end)asdecp2
FROMteacher
生成:
dept1 dept2
2 1
这个例子主要是学习了(CASE WHEN THEN ELSE end)语句的用法.
在我们做数据统计的时候这是一个非常有用的语句。