zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

sql学习之CASEWHENTHENELSEEND的用法

SQL学习 用法
2023-06-13 09:15:32 时间

超强: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)语句的用法.

在我们做数据统计的时候这是一个非常有用的语句。