case的两种表现方式和使用.docx
《case的两种表现方式和使用.docx》由会员分享,可在线阅读,更多相关《case的两种表现方式和使用.docx(6页珍藏版)》请在冰豆网上搜索。
![case的两种表现方式和使用.docx](https://file1.bdocx.com/fileroot1/2023-1/3/f60e1e64-e8be-408d-bfcc-06a615b13159/f60e1e64-e8be-408d-bfcc-06a615b131591.gif)
case的两种表现方式和使用
CASE语句
在某些方面,CASE语句是几种不同语句的一种等价物,这些语句来自你之前学过的语言。
在过程化的编程语言中,下面的语句与CASE的功能相似:
Switch:
C、C++、C#、Delphi
SelectCase:
VisualBasic
DoCase:
Xbase
Evaluate:
COBOL
我可以肯定还有其他语句,它们来自我多年前以这种或那种形式使用的语言。
在许多方面,在T-SQL中使用CASE语句的最大缺陷是置换运算符而不是流控制语句。
书写CASE语句的方法不止一种:
可以使用输入表达式或布尔表达式。
第一种选择是可以使用一个输入表达式,将它与每一个WHEN子句中使用的值进行比较。
SQLServer将其视为简单CASE:
1.CASE
2.WHEN THEN
3.[...n]
4.[ELSE ]
5.END
第二种选择是为每个WHEN子句提供一个表达式(计算结果为TRUE/FALSE)。
文档将其视为搜索CASE:
1.CASE
2.WHEN THEN
3.[...n]
4.[ELSE ]
5.END
或许CASE最大的好处是可以在SELECT语句里"内联"地(即,作为完整的部分)使用它。
这一功能绝对是非常强大的。
1.简单CASE
简单CASE使用一个可以得到布尔值结果的表达式。
下面看一个例子:
1.USE AdventureWorks2008;
2.GO
3.
4.SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS 'Last Digit', Position=
5.CASESalesOrderID % 10
6.WHEN 1 THEN 'First'
7.WHEN 2 THEN 'Second'
8.WHEN 3 THEN 'Third'
9.WHEN 4 THEN 'Fourth'
10.ELSE 'Something Else'
11.END
12.FROM Sales.SalesOrderHeader;
对于那些你还不熟悉的内容,%运算符用于取模。
取模的工作方式与被除(/)相似,不过它得到的只是余数。
因此,16%4=0(16可以被4整除),不过16%5=1(16除以5余数为1)。
在本例中,既然我们要将该值除以10,使用取模来得到的是要计算数据的末位数。
下面看一下返回结果:
1.SalesOrderID Last Digit Position
2.------------ ----------- --------------
3.75124 4 Fourth
4.43793 3 Third
5.51522 2 Second
6.57418 8 Something Else
7.43767 7 Something Else
8.51493 3 Third
9.72773 3 Third
10.43736 6 Something Else
11.51238 8 Something Else
12.53237 7 Something Else
13.
14.(10 row(s) affected)
注意,无论何时只要这张表中有匹配的数据值,就会调用THEN子句。
既然我们有一个ELSE子句,任何与之前的值不匹配的值都会被赋予在ELSE中指定的值分配新值。
如果不使用ELSE,那么任何此类值都可能被赋予NULL值。
下面再举一个例子扩展说明可以用作表达式的事物。
这一次,我们将在查询中使用另外的列:
1.USE AdventureWorks2008;
2.GO
3.
4.SELECT TOP 10 SalesOrderID % 10 AS 'OrderLastDigit',
5.ProductID % 10 AS 'ProductLastDigit',
6."How Close?
" = CASE SalesOrderID % 10
7.WHEN ProductID % 1 THEN 'Exact Match!
'
8.WHEN ProductID % 1 - 1 THEN 'Within 1'
9.WHEN ProductID % 1 + 1 THEN 'Within 1'
10.ELSE 'More Than One Apart'
11.END
12.FROM Sales.SalesOrderDetail
13.ORDER BY SalesOrderID DESC;
注意,本例的每一步都使用了表达式,不过它一样正常工作……
1.OrderLastDigit ProductLastDigit How Close?
2.-------------- ---------------- -------------------
3.4 5 More Than One Apart
4.3 2 More Than One Apart
5.3 9 More Than One Apart
6.3 8 More Than One Apart
7.2 2 More Than One Apart
8.2 8 More Than One Apart
9.1 7 Within 1
10.1 0 Within 1
11.1 1 Within 1
12.0 2 Exact Match!
13.
14.(10 row(s) affected)
只要表达式求出的值与输入表达式的数据类型相兼容,就可以进行对比分析。
并应用适当的THEN子句。
2.搜索CASE
搜索CASE和简单CASE非常相似,只有两点细微的差别:
没有输入表达式(记住,这是CASE和第一个WHEN之间的部分)。
WHEN表达式的结果必须是一个布尔值(在我们刚刚看过的简单CASE例子中,我们使用的值是1、3和ProductID+1)。
我发现这种CASE最酷的地方可能是,可以根据不同的可能情况改变构成表达式的基础--混合搭配列表达式。
同往常一样,我认为最好,用一个例子说明它的工作方式:
1.SELECT TOP 10 SalesOrderID % 10 AS 'OrderLastDigit',
2.ProductID % 10 AS 'ProductLastDigit',
3."How Close?
" = CASE
4.WHEN (SalesOrderID % 10) <3THEN 'Ends With Less Than Three'
5.WHEN ProductID= 6THEN 'ProductID is 6'
6.WHEN ABS(SalesOrderID % 10 - ProductID) <= 1 THEN 'Within 1'
7.
8.ELSE 'More Than One Apart'
9.END
10.FROM Sales.SalesOrderDetail
11.ORDER BY SalesOrderID DESC;
这个例子与简单CASE例子差别很大,不过仍然有效:
1.OrderLastDigit ProductLastDigit How Close?
2.-------------- ---------------- -------------------------
3.4 5 More Than One Apart
4.3 2 More Than One Apart
5.3 9 More Than One Apart
6.3 8 More Than One Apart
7.2 2 Ends With Less Than Three
8.2 8 Ends With Less Than Three
9.1 7 Ends With Less Than Three
10.1 0 Ends With Less Than Three
11.1 1 Ends With Less Than Three
12.0 2 Ends With Less Than Three
13.
14.(10 row(s) affected)
你要特别注意SQLServer的求值方式:
即使两个条件都为真,只使用第一个条件。
例如:
倒数第二行既符合第一个条件(最后一位数小于3)又符合第三个条件(最后一位数与ProductID的差值不大于1)。
对于许多语言来说,包括VisualBasic,这种语句都是这样工作的。
如果之前使用的是C语言,那么你必须记住在编写代码的时候不需要使用"break"语句。
只要满足一个条件就会终止CASE语句。
你可以对条件表达式中所用到的字段进行混合搭配。
在本例中,我们使用了SalesOrderID、ProductID以及两者的组合。
只要最终的返回结果是布尔值,就可以执行各种表达式。
SQL中Case的妙用
(一)
文章分类:
数据库
Case具有两种格式。
简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。
简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a') THEN '第二类'