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

39次阅读
没有评论

共计 3006 个字符,预计需要花费 8 分钟才能阅读完成。

行业资讯    
数据库    
如何理解 CASE 表达式作用及使用 SQLServerCASE 表达式代替动态 SQL

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

SQLServerCASE 表达式可以代替动态 SQL 语句,使进行大量更新查询操作时可以提高查询的效率。下面丸趣 TV 丸趣 TV 小编来讲解下 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,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计3006字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)