日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

T-SQL查询进阶--基于列的逻辑表达式

發布時間:2025/6/15 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 T-SQL查询进阶--基于列的逻辑表达式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

簡介

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

?????? CASE表達式實現的功能類似于編程語言中的IF…THEN…ELSE邏輯。只是CASE表達式在T-SQL中并不能控制T-SQL程序的流程,只是作為基于列的邏輯使用.

?????? 一個簡單的CASE表達式如下:

???????我已經知道員工ID對應的姓名,我想獲得員工ID,并將員工ID以姓名的方式展現出來,我不知道的員工ID則顯示UNKNOW:

SELECT TOP 4 CASE EmployeeIDWHEN 1 THEN 'CareySon'WHEN 2 THEN 'Jack'WHEN 3 THEN 'Tom'ELSE 'UNKNOW'END AS NameList,EmployeeIDFROM [AdventureWorks].[HumanResources].[Employee]ORDER BY EmployeeID

????

?????? 顯示結果如下:

???????

?????? 上面代碼中,CASE后面跟選擇的列名,后面的WHEN所取得值都為EmployeeID這一列,THEN后面的值為對應前面WHEN后面列中,實際在結果中顯示的值。

?

?????? CASE表達式實際情況可以分為兩種:

?????? CASE簡單表達式(CASE Simple Expression):將某個表達式與一組簡單表達式進行比較以確定結果。

?????? CASE 搜索表達式(CASE Searched Expression):計算一組布爾表達式以確定結果。

?

?????? 下面會按照這兩種CASE表達式來闡述

?

CASE簡單表達式(CASE Simple Expression)

????? 在CASE簡單表達式中,整個表達式只會取一列的值做相應的判斷,上面那個查詢例子就是一個CASE簡單表達式,可以用下圖表示:

?

?????

?????? CASE表達式也可以用這樣的寫法:

SELECT TOP 4 NameList=CASE EmployeeIDWHEN 1 THEN 'CareySon'WHEN 2 THEN 'Jack'WHEN 3 THEN 'Tom'ELSE 'UNKNOW'END,EmployeeIDFROM [AdventureWorks].[HumanResources].[Employee]ORDER BY EmployeeID

????? 上面代碼和前面代碼所達到的效果是一模一樣的,從這個代碼可以看出,CASE表達式的結果實際上只局限在一列當中,這也是為什么CASE表達式是“基于列的邏輯表達式”

????? 因為CASE表達式的值只局限在一列當中,所以THEN后面的值數據類型必須相同,或者兼容,否則就會報錯。

????

????? 在上面語句中,還有一個可選的“ELSE”語句,這個語句可以省略,但最好的做法是保留ELSE,否則不在匹配值范圍內的所有值都會為“NULL”。

?

CASE搜索表達式(CASE Searched?Expression)

?????與CASE簡單表達式不同,CASE搜索表達式提供了更強大的功能,CASE搜索表達式不僅可以使用更復雜的邏輯表達式,并且還能根據多列中的數據確定所顯示列的值。與上面CASE簡單表達式等效的CASE搜索表達式為:

SELECT TOP 4 NameList=CASE WHEN EmployeeID=1 THEN 'CareySon'WHEN EmployeeID=1 THEN 'Jack'WHEN EmployeeID=3 THEN 'Tom'ELSE 'UNKNOW'END,EmployeeIDFROM [AdventureWorks].[HumanResources].[Employee]ORDER BY EmployeeID

?

??? CASE搜索表達式更復雜的應用比如:

????公司規定每個人病假或者休假每年都不應該超過30個小時,現在我想取得所有男性員工的ID,其中員工病假或者是休假任意一項超過了30個小時,標記為“Exceed the time”,兩項都不超過30個小時的,標記為“Not Exceed the time”

SELECT EmployeeID,CASE WHEN VacationHours>30 AND Gender='M' THEN 'Exceed The Time'WHEN SickLeaveHours>30 AND Gender='M' THEN 'Exceed The Time'ELSE 'Not Exceed The Time'END AS ConditionFROM [AdventureWorks].[HumanResources].[Employee]

?? 查詢結果如下:

????

??? 上面可以看到,搜索表達式一列的WHEN表達式可以取自不同列,甚至是不同列之間的運算(比如上面可以取WHEN VacationHours+SickLeaveHours>60),這大大增強了CASE表達式的功能,因為CASE搜索表達式可以完全實現CASE簡單表達式所能實現的功能,我個人認為所有的CASE表達式都應該寫成CASE搜索表達式的形式。

?

??? 還有要注意WHEN…THEN是以先后順序出現,當第一個WHEN后面的表達式為FALSE時,則會去看第二個WHEN后的表達式,依次類推。當第一個WHEN后的表達式為TRUE時,則取第一個THEN后面的值,即使第二個WHEN表達式也為TRUE。

??? 例如還是第一個例子:我已經知道員工ID對應的姓名,我想獲得員工ID,并將員工ID以姓名的方式展現出來,我不知道的員工ID則顯示UNKNOW:

SELECT NameList=CASE WHEN EmployeeID=1 THEN 'CareySon'WHEN EmployeeID=1 THEN 'Jack'WHEN EmployeeID=3 THEN 'Tom'ELSE 'UNKNOW'END,EmployeeIDFROM [AdventureWorks].[HumanResources].[Employee]ORDER BY EmployeeID

?? 結果如下:

????

?

CASE表達式在ORDER BY中的使用

?

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

??? 比如:我想查看省份ID為8和9的員工的地址,當省份ID為9時,按照AddressID降序排列,當省份ID為8時,按照AddressID升序排列

SELECT [AddressID],[AddressLine1],[City],[StateProvinceID]FROM [AdventureWorks].[Person].[Address] WHERE StateProvinceID=9 OR StateProvinceID=8 ORDER BY CASE WHEN StateProvinceID=9 THEN AddressID END DESC,CASE WHEN StateProvinceID=8 THEN AddressID END

???

?? 結果如下:

???

???注意這里,每一條排序規則都要寫一個單獨的CASE表達式,前面文章說了,因為CASE表達式是基于列的,一個CASE表達式只能返回一個值,所以基于多少個值排序,則需要多少個CASE表達式

?

總結

??? 文章講述了CASE表達式在SELECT子句中和ORDER BY子句中的使用,CASE表達式又進一步分為CASE簡單表達式和CASE搜索表達式。掌握使用CASE表達式可以使程序員將一部分需要在程序中的業務邏輯移到數據庫中。掌握CASE表達式是深入學習T-SQL查詢必不可少的。

總結

以上是生活随笔為你收集整理的T-SQL查询进阶--基于列的逻辑表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。