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

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

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

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

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

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

CASE表達(dá)式可以用來:

用于更新行的時候,避免使用光標(biāo)回路
在使用合計函數(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)描述列用于生成所需報表的要求。你當(dāng)然可以使用指針掃描整個表,達(dá)到更新每一行的目的,但是這樣做很花時間,降低系統(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客戶的平均銷量。我們當(dāng)然可以把查詢范圍限制為Massachusetts客戶,但是這樣要獲得所有客戶總數(shù)就很麻煩。要解決這個問題,你可以編寫一個在合計函數(shù)里使用CASE表達(dá)的查詢,就能夠獲得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'

例四

最后一個請求。我們需要修改上述的存儲過程來達(dá)到通過某個特定狀態(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表達(dá)的內(nèi)容。
檢查你的數(shù)據(jù)庫更新代碼,看有沒有可以利用UPDATE…CASE處理的指針回路。
測評一下你的復(fù)雜的動態(tài)SQL邏輯看看是否可以利用CASE表達(dá)。

 

 

 

【編輯推薦】

SQL Server刪除視圖的兩種方法

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

sql server表格變量的用法

SQL Server變量賦值的方法

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

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

2009-03-16 14:01:24

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

2010-10-21 10:56:29

SQL Server查

2024-10-17 17:03:43

SQL正則表達(dá)式MySQL

2009-12-15 09:43:50

Ruby case w

2010-09-10 15:20:11

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

2024-06-27 00:36:06

2009-07-14 09:37:06

SQL Azure

2010-04-28 18:17:16

Oracle CASE

2010-09-07 16:51:22

SQL語句表達(dá)式

2009-03-23 10:47:43

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

2019-12-17 17:01:02

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

2022-01-14 07:56:39

C#動態(tài)查詢

2011-08-24 11:22:38

SQL ServerUNION代替OR

2014-01-05 17:41:09

PostgreSQL表達(dá)式

2011-04-22 11:07:24

groovyJava

2009-04-23 11:24:44

SQL正則表達(dá)式查詢

2010-11-09 15:06:52

SQL Server動

2010-08-05 09:07:24

2010-11-12 13:08:36

動態(tài)sql語句

2009-09-14 13:57:20

C# Lambda表達(dá)Lambda表達(dá)式
點贊
收藏

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

主站蜘蛛池模板: 久久久久国产精品www | 国产日韩欧美一区 | 欧美日本在线观看 | 久草视频在线播放 | 毛片的网址 | 成人av色 | 精品一二三区 | 欧美精品一区二区在线观看 | 欧美日韩国产精品一区二区 | av一区二区三区四区 | 国产黑丝av | 国产精品一区在线观看你懂的 | 成人深夜福利网站 | 亚洲一区二区在线视频 | 一级免费毛片 | av高清| 国产午夜视频 | 日日摸夜夜添夜夜添特色大片 | 国产一区欧美一区 | 日本成年免费网站 | 久久久成| 国产区在线视频 | 九九热最新视频 | 日韩中文不卡 | 国产精品一区久久久 | 亚洲成人免费视频 | 一区二区在线 | 影视先锋av资源噜噜 | 国产乱码精品一区二区三区五月婷 | 在线观看国产精品视频 | 久久婷婷香蕉热狠狠综合 | 久久国内精品 | 欧美一区二区三区视频在线观看 | 在线视频一区二区 | 99热这里 | 99久久婷婷国产综合精品 | 国产男女视频网站 | 国产高清视频一区二区 | 亚洲午夜电影 | 91一区二区| 国产成人精品久久 |