温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
  • 首页 > 
  • 教程 > 
  • 数据库 > 
  • 如何理解CASE表达式作用及使用SQLServerCASE 表达式代替动态SQL

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

发布时间:2021-11-29 16:12:50 来源:亿速云 阅读:161 作者:柒染 栏目:数据库

本篇文章为大家展示了如何理解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)

  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表达式代替动态SQL

  例一

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

  ALTERTABLEdbo.CustomerADDstatedescriptionVARCHAR(50)NULL

  GO

  UPDATEdbo.Customer

  SETstateDescription=CASEWHENstatecode='MA'THEN'Massachusetts'

  WHENstatecode='VA'THEN'Virginia'

  WHENstatecode='PA'THEN'Pennsylvania'

  ELSENULL

  END

  例二

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

  SELECTCOUNT(*)ASTotalCustomers,

  SUM(CASEWHENstatecode='MA'THEN1ELSENULLEND)ASTotalMassCustomers,

  AVG(CASEWHENstatecode='MA'THENtotalsalesELSENULLEND)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

  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'

  例四

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

  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'

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI