成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

T-SQL查詢中基于列的邏輯表達式的查詢詳解

數據庫 SQL Server
本文詳細介紹了T-SQL查詢中基于列的邏輯表達式查詢,并以實例的形式來進行說明,希望能夠對您有所幫助。

T-SQL查詢中我們有時候會用到基于列的邏輯表達式查詢,這正是本文我們要介紹的內容。接下來我們就一起來了解一下吧。

T-SQL不僅僅是一個用于查詢數據庫的語言,還是一個可以對數據進行操作的語言。基于列的CASE表達式就是其中一種,不像其他查詢語句可以互相替代(比如用子查詢實現的查詢也可以使用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:

  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 

顯示結果如下:

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

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

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

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

CASE簡單表達式(CASE Simple Expression)

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

T-SQL查詢中基于列的邏輯表達式的查詢詳解

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

  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 

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

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

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

CASE搜索表達式(CASE Searched Expression)

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

  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搜索表達式更復雜的應用比如:

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

查詢結果如下:

T-SQL查詢中基于列的邏輯表達式的查詢詳解

上面可以看到,搜索表達式一列的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:

  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 

結果如下:

T-SQL查詢中基于列的邏輯表達式的查詢詳解

CASE表達式在ORDER BY中的使用

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

比如:我想查看省份ID為8和9的員工的地址,當省份ID為9時,按照AddressID降序排列,當省份ID為8時,按照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 

結果如下:

T-SQL查詢中基于列的邏輯表達式的查詢詳解

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

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

關于T-SQL查詢中基于列的邏輯表達式的知識就介紹到這里了,希望本次的介紹能夠對您有所幫助。

【編輯推薦】

  1. SQL Server 2008數據庫學習筆記
  2. SQL Server 2005數據庫nolock使用詳解
  3. SQL Server如何啟用Ad Hoc Distributed Queries?
  4. SQL Server 2008用存儲過程實現插入更新數據的實例
  5. 含有GROUP BY子句的查詢中如何顯示COUNT()為0的結果
責任編輯:趙鵬 來源: 博客園
相關推薦

2010-10-21 10:56:29

SQL Server查

2009-08-27 09:13:28

LINQ查詢表達式

2011-10-19 10:07:16

T-SQL查詢變量

2022-01-14 07:56:39

C#動態查詢

2011-08-23 13:36:11

T-SQL查詢流程控制語句

2009-06-12 09:44:04

LINQ查詢復合from子句

2009-03-23 10:47:43

數據庫SQLLINQ

2024-03-01 08:51:01

Django查詢表達式查詢語句

2024-06-27 00:36:06

2011-10-28 16:34:13

LINQ

2009-09-10 15:35:07

LINQ查詢表達式

2009-04-29 10:00:25

SQL邏輯查詢優化

2019-12-17 17:01:02

MySQLSQL數據庫

2011-07-18 14:38:44

子查詢外部查詢

2009-09-17 11:08:55

LINQ查詢表達式

2017-04-21 11:24:13

數據庫Azure T-SQL編輯器

2011-08-24 16:36:00

T-SQL

2009-09-07 17:18:33

LINQ查詢表達式

2009-09-11 09:53:16

Linq查詢表達式

2024-10-17 17:03:43

SQL正則表達式MySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久一区二区三区四区 | 福利视频网址 | 欧美日韩精品 | 精品粉嫩aⅴ一区二区三区四区 | 精品国产一区二区三区日日嗨 | 亚洲视频在线一区 | 最新国产精品 | 日日操视频 | 亚洲网在线 | 蜜桃传媒一区二区 | 极品电影院 | 91一区二区 | 人人九九精| 草草视频在线免费观看 | 亚洲精品久久久久久久久久久久久 | 国产精品久久 | 91福利在线观看 | 中文字幕在线观看av | 一区二区免费在线观看 | 久热国产精品视频 | 国产伦精品一区二区三区照片91 | 天天看天天爽 | 中文字幕亚洲视频 | 精品99在线| 亚洲免费视频一区 | 中文字幕精品一区二区三区在线 | 久久精品免费观看 | 欧美男人亚洲天堂 | 中文字幕免费观看 | 欧美三级在线 | 欧美一区二区三区精品 | 亚洲欧美日韩在线 | 欧美性一区二区三区 | 男人的天堂在线视频 | 亚洲九色| 先锋资源在线 | 黄色毛片在线观看 | 夜夜草视频 | 日韩成人在线观看 | 丝袜一区二区三区 | 久久天堂网 |