如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL

网友投稿 417 2023-12-14

如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL

本篇文章为大家展示了如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL

SQLServerCASE表达式可以代替动态SQL语句,使进行大量更新查询操作时可以提高查询的效率。下面小编来讲解下CASE表达式作用有哪些?如何使用SQLServerCASE表达式代替动态SQL?

  CASE表达式作用有哪些

CASE语句是一个非常强大而有用的工具,你可以用它来解决你的SQLServer查询问题。你可能已经可以很熟练地在执行SELECT命令的时候使用它来模拟IF/ELSE从句处理。不过,它的功用可远远不限于这类型的处理。

  CASE表达式可以用来:

  用于更新行的时候,避免使用光标回路

在使用合计函数的时候执行专门的处理

  创建动态ORDERBY和WHERE从句而无需使用动态SQL

  现在让我们来看看一些应用例子:

  首先,新建一个名为Customer的表,插入一些行:

  CREATETABLEdbo.Customer

  (

customeridINTIDENTITYPRIMARYKEY,

  firstnameVARCHAR(40)NOTNULL,

  lastnameVARCHAR(40)NOTNULL,

statecodeVARCHAR(2)NOTNULL,

  totalsalesmoneyNOTNULLDEFAULT0.00

  )

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

  SELECTThomas,Jefferson,VA,100.00

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

  SELECTJohn,Adams,MA,200.00

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

SELECTPaul,Revere,MA,300.00

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

SELECTBen,Franklin,PA,400.00

  GO

  如何使用SQLServerCASE表达式代替动态SQL

  例一

现在遇到一个需要向表添加一个状态描述列用于生成所需报表的要求。你当然可以使用指针扫描整个表,达到更新每一行的目的,但是这样做很花时间,降低系统性能表现。你也可以创建多个UPDATE语句,但这样也好不到哪里去。但是,你可以把一个UPDATE语句和CASE结合使用,这样可以只需要一个SET操作就能够高效率地更新整个表。

ALTERTABLEdbo.CustomerADDstatedescriptionVARCHAR(50)NULL

  GO

  UPDATEdbo.Customer

SETstateDescription=CASEWHENstatecode=MATHENMassachusetts

  WHENstatecode=VATHENVirginia

  WHENstatecode=PATHENPennsylvania

  ELSENULL

END

  例二

现在我们又接到第二个请求,需要报告所有客户的总数、Massachusetts客户的总数以及所有Massachusetts客户的平均销量。我们当然可以把查询范围限制为Massachusetts客户,但是这样要获得所有客户总数就很麻烦。要解决这个问题,你可以编写一个在合计函数里使用CASE表达的查询,就能够获得Massachusetts客户的信息了:

SELECTCOUNT(*)ASTotalCustomers,

  SUM(CASEWHENstatecode=MATHEN1ELSENULLEND)ASTotalMassCustomers,

AVG(CASEWHENstatecode=MATHENtotalsalesELSENULLEND)ASTotalMassSales

  FROMdbo.Customer

  因为执行合计函数的时候会忽略NULL值,我们可以轻松获得需要的总数。

现在又来了新的请求。我们需要一个可以被应用程序调用的存储过程,但是用户希望能够可以通过firstname或lastname来排序。你可能会想要用动态SQL来解决这个问题,不过我们还可以使用CASE来代替动态SQL:

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

  AS

  SETnocountON

SELECTcustomerid,firstname,lastname,statecode,statedescription,totalsales

  FROMdbo.Customer

  ORDERBY

  CASE@sortdirection

WHENascTHEN

  CASE@sortby

  WHENfirstnameTHENfirstname

  WHENlastnameTHENlastname

  END

  END

  ASC,

  CASE@sortdirection

WHENdescTHEN

  CASE@sortby

  WHENfirstnameTHENfirstname

  WHENlastnameTHENlastname

  END

  END

  DESC

  GO

EXECdbo.getCustomerDatalastname,desc

  例四

  最后一个请求。我们需要修改上述的存储过程来达到通过某个特定状态来查找客户。假如客户状态被省略,则返回所有状态的客户。

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

  WHENascTHEN

  CASE@sortby

WHENfirstnameTHENfirstname

  WHENlastnameTHENlastname

  END

  END

  ASC,

  CASE@sortdirection

  WHENdescTHEN

  CASE@sortby

WHENfirstnameTHENfirstname

  WHENlastnameTHENlastname

  END

  END

  DESC

  GO

  EXECdbo.getCustomerDatalastname,desc,MA

上述内容就是如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL高可用复制管理工具Orchestrator怎么用
下一篇:Cassandra和HBase中怎样使用的BigTable模型
相关文章

 发表评论

暂时没有评论,来抢沙发吧~