溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解CASE表達(dá)式作用及使用SQLServerCASE 表達(dá)式代替動(dòng)態(tài)SQL

發(fā)布時(shí)間:2021-11-29 16:12:50 來(lái)源:億速云 閱讀:161 作者:柒染 欄目:數(shù)據(jù)庫(kù)

本篇文章為大家展示了如何理解CASE表達(dá)式作用及使用SQLServerCASE 表達(dá)式代替動(dòng)態(tài)SQL,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

  SQLServerCASE表達(dá)式可以代替動(dòng)態(tài)SQL語(yǔ)句,使進(jìn)行大量更新查詢操作時(shí)可以提高查詢的效率。下面億速云小編來(lái)講解下CASE表達(dá)式作用有哪些?如何使用SQLServerCASE表達(dá)式代替動(dòng)態(tài)SQL?

  CASE表達(dá)式作用有哪些

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

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

  用于更新行的時(shí)候,避免使用光標(biāo)回路

  在使用合計(jì)函數(shù)的時(shí)候執(zhí)行專門的處理

  創(chuàng)建動(dòng)態(tài)ORDERBY和WHERE從句而無(wú)需使用動(dòng)態(tài)SQL

  現(xiàn)在讓我們來(lái)看看一些應(yīng)用例子:

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

  CREATETABLEdbo.Customer

  (

  customeridINTIDENTITYPRIMARYKEY,

  firstnameVARCHAR(40)NOTNULL,

  lastnameVARCHAR(40)NOTNULL,

  statecodeVARCHAR(2)NOTNULL,

  totalsalesmoneyNOTNULLDEFAULT0.00

  )

  INSERTINTOdbo.Customer(firstname,lastname,statecode,totalsales)

  SELECT'Thomas','Jefferson','VA',100.00

  INSERTINTOdbo.Customer(firstname,lastname,statecode,totalsales)

  SELECT'John','Adams','MA',200.00

  INSERTINTOdbo.Customer(firstname,lastname,statecode,totalsales)

  SELECT'Paul','Revere','MA',300.00

  INSERTINTOdbo.Customer(firstname,lastname,statecode,totalsales)

  SELECT'Ben','Franklin','PA',400.00

  GO

  如何使用SQLServerCASE表達(dá)式代替動(dòng)態(tài)SQL

  例一

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

  ALTERTABLEdbo.CustomerADDstatedescriptionVARCHAR(50)NULL

  GO

  UPDATEdbo.Customer

  SETstateDescription=CASEWHENstatecode='MA'THEN'Massachusetts'

  WHENstatecode='VA'THEN'Virginia'

  WHENstatecode='PA'THEN'Pennsylvania'

  ELSENULL

  END

  例二

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

  SELECTCOUNT(*)ASTotalCustomers,

  SUM(CASEWHENstatecode='MA'THEN1ELSENULLEND)ASTotalMassCustomers,

  AVG(CASEWHENstatecode='MA'THENtotalsalesELSENULLEND)ASTotalMassSales

  FROMdbo.Customer

  因?yàn)閳?zhí)行合計(jì)函數(shù)的時(shí)候會(huì)忽略NULL值,我們可以輕松獲得需要的總數(shù)。

  現(xiàn)在又來(lái)了新的請(qǐng)求。我們需要一個(gè)可以被應(yīng)用程序調(diào)用的存儲(chǔ)過(guò)程,但是用戶希望能夠可以通過(guò)firstname或lastname來(lái)排序。你可能會(huì)想要用動(dòng)態(tài)SQL來(lái)解決這個(gè)問(wèn)題,不過(guò)我們還可以使用CASE來(lái)代替動(dòng)態(tài)SQL:

  CREATEPROCEDUREdbo.getCustomerData@sortbyVARCHAR(9),@sortdirectionCHAR(4)

  AS

  SETnocountON

  SELECTcustomerid,firstname,lastname,statecode,statedescription,totalsales

  FROMdbo.Customer

  ORDERBY

  CASE@sortdirection

  WHEN'asc'THEN

  CASE@sortby

  WHEN'firstname'THENfirstname

  WHEN'lastname'THENlastname

  END

  END

  ASC,

  CASE@sortdirection

  WHEN'desc'THEN

  CASE@sortby

  WHEN'firstname'THENfirstname

  WHEN'lastname'THENlastname

  END

  END

  DESC

  GO

  EXECdbo.getCustomerData'lastname','desc'

  例四

  最后一個(gè)請(qǐng)求。我們需要修改上述的存儲(chǔ)過(guò)程來(lái)達(dá)到通過(guò)某個(gè)特定狀態(tài)來(lái)查找客戶。假如客戶狀態(tài)被省略,則返回所有狀態(tài)的客戶。

  ALTERPROCEDUREdbo.getCustomerData@sortbyVARCHAR(9),@sortdirectionCHAR(4),@statecodeVARCHAR(2)=NULL

  AS

  SETnocountON

  SELECTcustomerid,firstname,lastname,statecode,statedescription,totalsales

  FROMdbo.Customer

  WHEREstatecode=CASEWHEN@statecodeISNOTNULLTHEN@statecode

  ELSEstatecode

  END

  ORDERBY

  CASE@sortdirection

  WHEN'asc'THEN

  CASE@sortby

  WHEN'firstname'THENfirstname

  WHEN'lastname'THENlastname

  END

  END

  ASC,

  CASE@sortdirection

  WHEN'desc'THEN

  CASE@sortby

  WHEN'firstname'THENfirstname

  WHEN'lastname'THENlastname

  END

  END

  DESC

  GO

  EXECdbo.getCustomerData'lastname','desc','MA'

上述內(nèi)容就是如何理解CASE表達(dá)式作用及使用SQLServerCASE 表達(dá)式代替動(dòng)態(tài)SQL,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI