共计 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 行业资讯频道。