自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

T-SQL查詢(xún)中基于列的邏輯表達(dá)式的查詢(xún)?cè)斀?/h1>

數(shù)據(jù)庫(kù) SQL Server
本文詳細(xì)介紹了T-SQL查詢(xún)中基于列的邏輯表達(dá)式查詢(xún),并以實(shí)例的形式來(lái)進(jìn)行說(shuō)明,希望能夠?qū)δ兴鶐椭?/div>

T-SQL查詢(xún)中我們有時(shí)候會(huì)用到基于列的邏輯表達(dá)式查詢(xún),這正是本文我們要介紹的內(nèi)容。接下來(lái)我們就一起來(lái)了解一下吧。

T-SQL不僅僅是一個(gè)用于查詢(xún)數(shù)據(jù)庫(kù)的語(yǔ)言,還是一個(gè)可以對(duì)數(shù)據(jù)進(jìn)行操作的語(yǔ)言?;诹械腃ASE表達(dá)式就是其中一種,不像其他查詢(xún)語(yǔ)句可以互相替代(比如用子查詢(xún)實(shí)現(xiàn)的查詢(xún)也可以使用Join實(shí)現(xiàn)),CASE表達(dá)式在控制基于列的邏輯大部分是無(wú)法替代的。下面文中會(huì)詳細(xì)講解CASE表達(dá)式。

簡(jiǎn)介

基于列的邏輯表達(dá)式,其實(shí)就是CASE表達(dá)式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后。由于這里講的是T-SQL查詢(xún),所以只說(shuō)到CASE表達(dá)式在SELECT子句和ORDER BY子句中的使用。

CASE表達(dá)式實(shí)現(xiàn)的功能類(lèi)似于編程語(yǔ)言中的IF…THEN…ELSE邏輯。只是CASE表達(dá)式在T-SQL中并不能控制T-SQL程序的流程,只是作為基于列的邏輯使用.

一個(gè)簡(jiǎn)單的CASE表達(dá)式如下:

我已經(jīng)知道員工ID對(duì)應(yīng)的姓名,我想獲得員工ID,并將員工ID以姓名的方式展現(xiàn)出來(lái),我不知道的員工ID則顯示UNKNOW:

  1. SELECT TOP 4 CASE EmployeeID  
  2.  
  3. WHEN 1   
  4.  
  5. THEN 'CareySon'  
  6.  
  7. WHEN 2   
  8.  
  9. THEN 'Jack'  
  10.  
  11. WHEN 3   
  12.  
  13. THEN 'Tom'  
  14.  
  15. ELSE 'UNKNOW'  
  16.  
  17. END AS NameList,EmployeeID  
  18.  
  19. FROM [AdventureWorks].[HumanResources].[Employee]  
  20.  
  21. ORDER BY EmployeeID 

顯示結(jié)果如下:

上面代碼中,CASE后面跟選擇的列名,后面的WHEN所取得值都為EmployeeID這一列,THEN后面的值為對(duì)應(yīng)前面WHEN后面列中,實(shí)際在結(jié)果中顯示的值。

CASE表達(dá)式實(shí)際情況可以分為兩種:

CASE簡(jiǎn)單表達(dá)式(CASE Simple Expression):將某個(gè)表達(dá)式與一組簡(jiǎn)單表達(dá)式進(jìn)行比較以確定結(jié)果。

CASE 搜索表達(dá)式(CASE Searched Expression):計(jì)算一組布爾表達(dá)式以確定結(jié)果。

CASE簡(jiǎn)單表達(dá)式(CASE Simple Expression)

在CASE簡(jiǎn)單表達(dá)式中,整個(gè)表達(dá)式只會(huì)取一列的值做相應(yīng)的判斷,上面那個(gè)查詢(xún)例子就是一個(gè)CASE簡(jiǎn)單表達(dá)式,可以用下圖表示:

T-SQL查詢(xún)中基于列的邏輯表達(dá)式的查詢(xún)?cè)斀? width=

CASE表達(dá)式也可以用這樣的寫(xiě)法:

  1. SELECT TOP 4 NameList=CASE EmployeeID  
  2.  
  3. WHEN 1 THEN 'CareySon'  
  4.  
  5. WHEN 2 THEN 'Jack'  
  6.  
  7. WHEN 3 THEN 'Tom'  
  8.  
  9. ELSE 'UNKNOW'  
  10.  
  11. END,EmployeeID  
  12.  
  13. FROM [AdventureWorks].[HumanResources].[Employee]  
  14.  
  15. ORDER BY EmployeeID 

上面代碼和前面代碼所達(dá)到的效果是一模一樣的,從這個(gè)代碼可以看出,CASE表達(dá)式的結(jié)果實(shí)際上只局限在一列當(dāng)中,這也是為什么CASE表達(dá)式是“基于列的邏輯表達(dá)式”

因?yàn)镃ASE表達(dá)式的值只局限在一列當(dāng)中,所以THEN后面的值數(shù)據(jù)類(lèi)型必須相同,或者兼容,否則就會(huì)報(bào)錯(cuò)。

在上面語(yǔ)句中,還有一個(gè)可選的“ELSE”語(yǔ)句,這個(gè)語(yǔ)句可以省略,但***的做法是保留ELSE,否則不在匹配值范圍內(nèi)的所有值都會(huì)為“NULL”。

CASE搜索表達(dá)式(CASE Searched Expression)

與CASE簡(jiǎn)單表達(dá)式不同,CASE搜索表達(dá)式提供了更強(qiáng)大的功能,CASE搜索表達(dá)式不僅可以使用更復(fù)雜的邏輯表達(dá)式,并且還能根據(jù)多列中的數(shù)據(jù)確定所顯示列的值。與上面CASE簡(jiǎn)單表達(dá)式等效的CASE搜索表達(dá)式為:

  1. SELECT TOP 4 NameList=CASE   
  2.  
  3. WHEN EmployeeID=1 THEN 'CareySon'  
  4.  
  5. WHEN EmployeeID=1 THEN 'Jack'  
  6.  
  7. WHEN EmployeeID=3 THEN 'Tom'  
  8.  
  9. ELSE 'UNKNOW'  
  10.  
  11. END,EmployeeID  
  12.  
  13. FROM [AdventureWorks].[HumanResources].[Employee]  
  14.  
  15. ORDER BY EmployeeID 

CASE搜索表達(dá)式更復(fù)雜的應(yīng)用比如:

公司規(guī)定每個(gè)人病假或者休假每年都不應(yīng)該超過(guò)30個(gè)小時(shí),現(xiàn)在我想取得所有男性員工的ID,其中員工病假或者是休假任意一項(xiàng)超過(guò)了30個(gè)小時(shí),標(biāo)記為“Exceed the time”,兩項(xiàng)都不超過(guò)30個(gè)小時(shí)的,標(biāo)記為“Not Exceed the time”

  1. SELECT EmployeeID,  
  2.  
  3. CASE   
  4.  
  5. WHEN VacationHours>30 AND Gender='M' THEN 'Exceed The Time'  
  6.  
  7. WHEN SickLeaveHours>30 AND Gender='M' THEN 'Exceed The Time'  
  8.  
  9. ELSE 'Not Exceed The Time'  
  10.  
  11. END AS Condition  
  12.  
  13. FROM [AdventureWorks].[HumanResources].[Employee] 

查詢(xún)結(jié)果如下:

T-SQL查詢(xún)中基于列的邏輯表達(dá)式的查詢(xún)?cè)斀? width=

上面可以看到,搜索表達(dá)式一列的WHEN表達(dá)式可以取自不同列,甚至是不同列之間的運(yùn)算(比如上面可以取WHEN VacationHours+SickLeaveHours>60),這大大增強(qiáng)了CASE表達(dá)式的功能,因?yàn)镃ASE搜索表達(dá)式可以完全實(shí)現(xiàn)CASE簡(jiǎn)單表達(dá)式所能實(shí)現(xiàn)的功能,我個(gè)人認(rèn)為所有的CASE表達(dá)式都應(yīng)該寫(xiě)成CASE搜索表達(dá)式的形式。

還有要注意WHEN…THEN是以先后順序出現(xiàn),當(dāng)***個(gè)WHEN后面的表達(dá)式為FALSE時(shí),則會(huì)去看第二個(gè)WHEN后的表達(dá)式,依次類(lèi)推。當(dāng)***個(gè)WHEN后的表達(dá)式為T(mén)RUE時(shí),則取***個(gè)THEN后面的值,即使第二個(gè)WHEN表達(dá)式也為T(mén)RUE。

例如還是***個(gè)例子:我已經(jīng)知道員工ID對(duì)應(yīng)的姓名,我想獲得員工ID,并將員工ID以姓名的方式展現(xiàn)出來(lái),我不知道的員工ID則顯示UNKNOW:

  1. SELECT NameList=CASE   
  2.  
  3. WHEN EmployeeID=1 THEN 'CareySon'  
  4.  
  5. WHEN EmployeeID=1 THEN 'Jack'  
  6.  
  7. WHEN EmployeeID=3 THEN 'Tom'  
  8.  
  9. ELSE 'UNKNOW'  
  10.  
  11. END,EmployeeID  
  12.  
  13. FROM [AdventureWorks].[HumanResources].[Employee]  
  14.  
  15. ORDER BY EmployeeID 

結(jié)果如下:

T-SQL查詢(xún)中基于列的邏輯表達(dá)式的查詢(xún)?cè)斀? width=

CASE表達(dá)式在ORDER BY中的使用

CASE表達(dá)式在ORDER BY中可以將排序結(jié)果分類(lèi),使符合某些條件的行(Row)采用一種排序方式,符合另一種條件的行采用另一種排序方式:

比如:我想查看省份ID為8和9的員工的地址,當(dāng)省份ID為9時(shí),按照AddressID降序排列,當(dāng)省份ID為8時(shí),按照AddressID升序排列

  1. SELECT [AddressID]  
  2.  
  3. ,[AddressLine1]  
  4.  
  5. ,[City]  
  6.  
  7. ,[StateProvinceID]  
  8.  
  9. FROM [AdventureWorks].[Person].[Address]  
  10.  
  11. WHERE StateProvinceID=9 OR StateProvinceID=8 
  12.  
  13. ORDER BY   
  14.  
  15. CASE WHEN StateProvinceID=9 THEN AddressID END DESC,  
  16.  
  17. CASE WHEN StateProvinceID=8 THEN AddressID END 

結(jié)果如下:

T-SQL查詢(xún)中基于列的邏輯表達(dá)式的查詢(xún)?cè)斀? width=

注意這里,每一條排序規(guī)則都要寫(xiě)一個(gè)單獨(dú)的CASE表達(dá)式,前面文章說(shuō)了,因?yàn)镃ASE表達(dá)式是基于列的,一個(gè)CASE表達(dá)式只能返回一個(gè)值,所以基于多少個(gè)值排序,則需要多少個(gè)CASE表達(dá)式。

總結(jié):文章講述了CASE表達(dá)式在SELECT子句中和ORDER BY子句中的使用,CASE表達(dá)式又進(jìn)一步分為CASE簡(jiǎn)單表達(dá)式和CASE搜索表達(dá)式。掌握使用CASE表達(dá)式可以使程序員將一部分需要在程序中的業(yè)務(wù)邏輯移到數(shù)據(jù)庫(kù)中。掌握CASE表達(dá)式是深入學(xué)習(xí)T-SQL查詢(xún)必不可少的。

關(guān)于T-SQL查詢(xún)中基于列的邏輯表達(dá)式的知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴鶐椭?/p>

【編輯推薦】

  1. SQL Server 2008數(shù)據(jù)庫(kù)學(xué)習(xí)筆記
  2. SQL Server 2005數(shù)據(jù)庫(kù)nolock使用詳解
  3. SQL Server如何啟用Ad Hoc Distributed Queries?
  4. SQL Server 2008用存儲(chǔ)過(guò)程實(shí)現(xiàn)插入更新數(shù)據(jù)的實(shí)例
  5. 含有GROUP BY子句的查詢(xún)中如何顯示COUNT()為0的結(jié)果
責(zé)任編輯:趙鵬 來(lái)源: 博客園
相關(guān)推薦

2010-10-21 10:56:29

SQL Server查

2009-08-27 09:13:28

LINQ查詢(xún)表達(dá)式

2011-10-19 10:07:16

T-SQL查詢(xún)變量

2022-01-14 07:56:39

C#動(dòng)態(tài)查詢(xún)

2024-03-01 08:51:01

Django查詢(xún)表達(dá)式查詢(xún)語(yǔ)句

2009-06-12 09:44:04

LINQ查詢(xún)復(fù)合from子句

2011-08-23 13:36:11

T-SQL查詢(xún)流程控制語(yǔ)句

2009-03-23 10:47:43

數(shù)據(jù)庫(kù)SQLLINQ

2024-06-27 00:36:06

2009-09-10 15:35:07

LINQ查詢(xún)表達(dá)式

2011-10-28 16:34:13

LINQ

2011-07-18 14:38:44

子查詢(xún)外部查詢(xún)

2019-12-17 17:01:02

MySQLSQL數(shù)據(jù)庫(kù)

2009-04-29 10:00:25

SQL邏輯查詢(xún)優(yōu)化

2009-09-17 11:08:55

LINQ查詢(xún)表達(dá)式

2011-08-24 16:36:00

T-SQL

2009-09-07 17:18:33

LINQ查詢(xún)表達(dá)式

2009-09-11 09:53:16

Linq查詢(xún)表達(dá)式

2017-04-21 11:24:13

數(shù)據(jù)庫(kù)Azure T-SQL編輯器

2010-09-10 15:20:11

SQL函數(shù)計(jì)算表達(dá)式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)