现在的位置: 首页 > 数据库 > 正文

CASE表达式作用有哪些?如何使用SQLServerCASE表达式代替动态SQL

2020年05月20日 数据库 ⁄ 共 3123字 ⁄ 字号 评论关闭

  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”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.