case的两种表现方式和使用.docx

上传人:b****6 文档编号:6079861 上传时间:2023-01-03 格式:DOCX 页数:6 大小:16.82KB
下载 相关 举报
case的两种表现方式和使用.docx_第1页
第1页 / 共6页
case的两种表现方式和使用.docx_第2页
第2页 / 共6页
case的两种表现方式和使用.docx_第3页
第3页 / 共6页
case的两种表现方式和使用.docx_第4页
第4页 / 共6页
case的两种表现方式和使用.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

case的两种表现方式和使用.docx

《case的两种表现方式和使用.docx》由会员分享,可在线阅读,更多相关《case的两种表现方式和使用.docx(6页珍藏版)》请在冰豆网上搜索。

case的两种表现方式和使用.docx

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 '第二类'

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1