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

使用SQL Server CASE表達式代替動態(tài)SQL

數(shù)據(jù)庫 SQL Server
SQL Server中的CASE語句功能很強大,它可以輕松幫助我們解決SQL Server數(shù)據(jù)庫在進行大量更新查詢操作時的效率問題。

SQL Server CASE表達式可以代替動態(tài)SQL語句,使進行大量更新查詢操作時可以提高查詢的效率,下面就讓我們一起了解一下使用SQL Server CASE表達式代替動態(tài)SQL的方法。

需要進行大量的SQL更新查詢,而這些查詢都需要我做出IF/ELSE之類的決定。我現(xiàn)在有的情況會使用光標,但是這樣搜查上千行查找更新需要花很長時間。有時候也使用一些動態(tài)SQL來決定某些查詢參數(shù)。但是有沒有更好的方法可以使用呢?

CASE語句是一個非常強大而有用的工具,你可以用它來解決你的SQL Server查詢問題。你可能已經(jīng)可以很熟練地在執(zhí)行SELECT命令的時候使用它來模擬IF/ELSE從句處理。不過,它的功用可遠遠不限于這類型的處理。

CASE表達式可以用來:

用于更新行的時候,避免使用光標回路
在使用合計函數(shù)的時候執(zhí)行專門的處理
創(chuàng)建動態(tài)ORDER BY和WHERE從句而無需使用動態(tài)SQL
現(xiàn)在讓我們來看看一些應(yīng)用例子:

首先,新建一個名為Customer的表,插入一些行:

CREATE TABLE dbo.Customer
(
customerid INT IDENTITY PRIMARY KEY,
firstname VARCHAR(40) NOT NULL,
lastname VARCHAR(40) NOT NULL,
statecode VARCHAR(2) NOT NULL,
totalsales money NOT NULL DEFAULT 0.00
)
INSERT INTO dbo.Customer (firstname, lastname, statecode, totalsales)
SELECT 'Thomas', 'Jefferson', 'VA', 100.00
INSERT INTO dbo.Customer (firstname, lastname, statecode, totalsales)
SELECT 'John', 'Adams', 'MA', 200.00
INSERT INTO dbo.Customer (firstname, lastname, statecode, totalsales)
SELECT 'Paul', 'Revere', 'MA', 300.00
INSERT INTO dbo.Customer (firstname, lastname, statecode, totalsales)
SELECT 'Ben', 'Franklin', 'PA', 400.00
GO

例一

現(xiàn)在遇到一個需要向表添加一個狀態(tài)描述列用于生成所需報表的要求。你當然可以使用指針掃描整個表,達到更新每一行的目的,但是這樣做很花時間,降低系統(tǒng)性能表現(xiàn)。你也可以創(chuàng)建多個UPDATE語句,但這樣也好不到哪里去。但是,你可以把一個UPDATE語句和CASE結(jié)合使用,這樣可以只需要一個SET操作就能夠高效率地更新整個表。

ALTER TABLE dbo.Customer ADD statedescription VARCHAR(50) NULL
GO
UPDATE dbo.Customer
SET stateDescription = CASE WHEN statecode = 'MA' THEN 'Massachusetts'
WHEN statecode = 'VA' THEN 'Virginia'
WHEN statecode = 'PA' THEN 'Pennsylvania'
ELSE NULL
END

例二

現(xiàn)在我們又接到第二個請求,需要報告所有客戶的總數(shù)、Massachusetts客戶的總數(shù)以及所有Massachusetts客戶的平均銷量。我們當然可以把查詢范圍限制為Massachusetts客戶,但是這樣要獲得所有客戶總數(shù)就很麻煩。要解決這個問題,你可以編寫一個在合計函數(shù)里使用CASE表達的查詢,就能夠獲得Massachusetts客戶的信息了:

SELECT COUNT(*) AS TotalCustomers,
SUM(CASE WHEN statecode = 'MA' THEN 1 ELSE NULL END) AS TotalMassCustomers,
AVG(CASE WHEN statecode = 'MA' THEN totalsales ELSE NULL END) AS TotalMassSales
FROM dbo.Customer

因為執(zhí)行合計函數(shù)的時候會忽略NULL值,我們可以輕松獲得需要的總數(shù)。

現(xiàn)在又來了新的請求。我們需要一個可以被應(yīng)用程序調(diào)用的存儲過程,但是用戶希望能夠可以通過first name或last name來排序。你可能會想要用動態(tài)SQL來解決這個問題,不過我們還可以使用CASE來代替動態(tài)SQL:

CREATE PROCEDURE dbo.getCustomerData @sortby VARCHAR(9), @sortdirection CHAR(4)
AS
SET nocount ON
SELECT customerid, firstname, lastname, statecode, statedescription, totalsales
FROM dbo.Customer
ORDER BY
CASE @sortdirection
WHEN 'asc' THEN
CASE @sortby
WHEN 'firstname' THEN firstname
WHEN 'lastname' THEN lastname
END
END
ASC,
CASE @sortdirection
WHEN 'desc' THEN
CASE @sortby
WHEN 'firstname' THEN firstname
WHEN 'lastname' THEN lastname
END
END
DESC
GO
EXEC dbo.getCustomerData 'lastname', 'desc'

例四

最后一個請求。我們需要修改上述的存儲過程來達到通過某個特定狀態(tài)來查找客戶。如果客戶狀態(tài)被省略,則返回所有狀態(tài)的客戶。
ALTER PROCEDURE dbo.getCustomerData @sortby VARCHAR(9), @sortdirection CHAR(4), @statecode VARCHAR(2) = NULL
AS
SET nocount ON
SELECT customerid, firstname, lastname, statecode, statedescription, totalsales
FROM dbo.Customer
WHERE statecode = CASE WHEN @statecode IS NOT NULL THEN @statecode
ELSE statecode
END
ORDER BY
CASE @sortdirection
WHEN 'asc' THEN
CASE @sortby
WHEN 'firstname' THEN firstname
WHEN 'lastname' THEN lastname
END
END
ASC,
CASE @sortdirection
WHEN 'desc' THEN
CASE @sortby
WHEN 'firstname' THEN firstname
WHEN 'lastname' THEN lastname
END
END
DESC
GO
EXEC dbo.getCustomerData 'lastname', 'desc', 'MA'

你可以根據(jù)下面幾條小提示來熟悉CASE的利用:

在線閱讀SQL Server 2000和2005關(guān)于CASE表達的內(nèi)容。
檢查你的數(shù)據(jù)庫更新代碼,看有沒有可以利用UPDATE…CASE處理的指針回路。
測評一下你的復雜的動態(tài)SQL邏輯看看是否可以利用CASE表達。

 

 

 

【編輯推薦】

SQL Server刪除視圖的兩種方法

帶您了解sql server內(nèi)部變量

sql server表格變量的用法

SQL Server變量賦值的方法

Java調(diào)用Sql Server存儲過程

責任編輯:段燃 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-03-16 14:01:24

正則表達式函數(shù)SQL

2010-10-21 10:56:29

SQL Server查

2024-10-17 17:03:43

SQL正則表達式MySQL

2009-12-15 09:43:50

Ruby case w

2010-09-10 15:20:11

SQL函數(shù)計算表達式

2024-06-27 00:36:06

2010-04-28 18:17:16

Oracle CASE

2009-07-14 09:37:06

SQL Azure

2010-09-07 16:51:22

SQL語句表達式

2009-03-23 10:47:43

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

2011-08-24 11:22:38

SQL ServerUNION代替OR

2009-04-23 11:24:44

SQL正則表達式查詢

2011-04-22 11:07:24

groovyJava

2022-01-14 07:56:39

C#動態(tài)查詢

2019-12-17 17:01:02

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

2014-01-05 17:41:09

PostgreSQL表達式

2024-05-15 08:09:23

2010-11-09 15:06:52

SQL Server動

2011-11-28 15:16:05

Wireshark表達式IP過濾

2023-10-07 08:25:09

Java處理工具正則表達式
點贊
收藏

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

主站蜘蛛池模板: 成人在线视频免费观看 | 久久一二 | 在线亚洲人成电影网站色www | 欧美一区二区三区视频在线播放 | 天天射夜夜操 | 欧美精品一区三区 | 久草.com| 日日夜夜天天 | 四虎免费视频 | 亚洲视频中文字幕 | 成人av免费播放 | 色婷婷亚洲国产女人的天堂 | 久久久青草婷婷精品综合日韩 | 亚洲社区在线 | 成人在线中文字幕 | 国产精品亚洲一区二区三区在线观看 | 精品国产乱码久久久久久蜜退臀 | 伦理午夜电影免费观看 | 亚洲三级在线 | 欧美精品在线免费观看 | 亚洲va在线va天堂va狼色在线 | 亚洲精品视频在线看 | 欧美久久久久 | 久久精品久久久久久 | 午夜一级大片 | 亚洲成人三区 | 在线观看日本网站 | 国产高清在线精品 | 成人超碰 | 亚洲欧美综合精品久久成人 | 涩涩视频在线观看 | 欧美8一10sex性hd | 国产免费黄网 | 成av在线| 999免费网站| 国产成人麻豆免费观看 | 视频精品一区二区三区 | 一区二区三区视频 | 一区日韩 | 黑人巨大精品 | 成人在线视频免费观看 |