sql学习之CASEWHENTHENELSEEND的用法
超强: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)语句的用法.
在我们做数据统计的时候这是一个非常有用的语句。
相关文章
- 客快物流大数据项目(九十八):ClickHouse的SQL函数
- ORA-31222: DBMS_LDAP: PL/SQL – Invalid LDAP SSL authentication mode. ORACLE 报错 故障修复 远程处理
- PL/SQL 创建、查看、操作用户详解编程语言
- MySQL如何输出SQL语句?25字教程速成!(mysql输出sql)
- 禁止使用SQL Server系统(禁止sqlserver)
- 学习MySQL使用SQL语句的技巧(mysql sql语句)
- Oracle通过SQL脚本实现快速操作(oracle执行sql脚本)
- 攀登青云之路:学习SQL Server(青云sqlserver)
- sql学习使用LR分析Oracle SQL语句的完美指南(lr 写oracle)
- 提升提升Oracle中SQL的效率之道(oracle中sql效率)
- Oracle中学习SQL语句的有效技巧(oracle中sql代码)
- Oracle SQL小试牛刀踏上编程之路(oracle sql练手)
- 深入浅出学习Oracle SQL中文(oracle sql中文)
- Sql学习第三天——SQL关于withties介绍
- Sql学习第四天——SQL关于withcube,withrollup和grouping解释及演示