`
sjk2013
  • 浏览: 2184916 次
文章分类
社区版块
存档分类
最新评论

使用CASE表达式替代SQL Server中的动态SQL

 
阅读更多

翻译自:

http://www.mssqltips.com/sqlservertip/1455/using-the-case-expression-instead-of-dynamic-sql-in-sql-server/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012620

问题:

在决定IF/ELSE时,会有很多UPDATE查询,某些情况下我使用游标,但循环几千行数据的UPDATE时,会花费非常多的事件。我也使用一些动态SQL来处理一些查询参数。除此之外,还有更好的选择吗?

解决方案:

CASE表达式是在解决SQLServer查询问题上的一个强大的工具。你可能感觉到它在SELECT语句中的用法类似于IF/ELSE的处理。但是,相对与IF/ELSE,CASE表达式却没有那么多限制。

在以下代码中将展示CASE表达式的用处:

l 消除在UPDATE行时的游标循环。

l 在使用聚集函数时,执行特殊处理。

l 不使用动态SQL的动态ORDER BY 和WHERE子句

让我们看看以下例子:

首先,先创建一个名为Customer的表并插入数据:

CREATE TABLE dbo.Customer

(

customerid INT IDENTITY PRIMARY KEY,

firstname VARCHAR(40) NOT NULL,

lastname VARCHAR(40) NOT NULL,

statecode VARCHAR(2) NOT NULL,

totalsales money NOT NULL DEFAULT 0.00

)

INSERT INTO dbo.Customer(firstname, lastname, statecode, totalsales)

SELECT 'Thomas', 'Jefferson', 'VA', 100.00

INSERT INTO dbo.Customer(firstname, lastname, statecode, totalsales)

SELECT 'John', 'Adams', 'MA', 200.00

INSERT INTO dbo.Customer(firstname, lastname, statecode, totalsales)

SELECT 'Paul', 'Revere', 'MA', 300.00

INSERT INTO dbo.Customer(firstname, lastname, statecode, totalsales)

SELECT 'Ben', 'Franklin', 'PA', 400.00

GO

示例1:

由于报表展示的需要,在一个非范式化的表中增加一个所在州描述列。现在,你可以使用游标和来循环更新每一行。但是游标往往是性能杀手。你也可以使用大量UPDATE语句,但是这将导致程序非常臃肿。

对此,可以在一个UDPATE语句的SET 子句中使用带有CASE关键字来实现更有效的操作:

ALTERTABLEdbo.CustomerADDstatedescriptionVARCHAR(50)NULL
GO
UPDATEdbo.Customer
SETstateDescription=CASEWHENstatecode='MA'THEN'Massachusetts'
WHENstatecode='VA'THEN'Virginia'
WHENstatecode='PA'THEN'Pennsylvania'
ELSENULL
END

示例2

当我们需要统计所有来自Massachusetts州用户的数量及他们的平均总消费时。我们能限制查询在仅仅是Massachusetts的客户。但这将使得在得到用户总数时语句变得臃肿,为此,可以在聚集函数中使用CASE表达式来得到特定信息:

SELECTCOUNT(*)ASTotalCustomers,
SUM(CASEWHENstatecode='MA'THEN1ELSENULLEND)ASTotalMassCustomers,
AVG(CASEWHENstatecode='MA'THENtotalsalesELSENULLEND)ASTotalMassSales
FROMdbo.Customer

因为在聚集函数中,NULL值不参与计算,所以可以通过这个特性来获得我们想要的数据。

示例3:

第三个案例来自于我们的桌面,我们需要一个存储过程来被应用程序调用,但用户想根据第一个名字或者第二个名字排序。其中一个方法是使用动态SQL来解决这个问题,但是我们可以使用CASE来等价实现:

CREATE PROCEDURE dbo.getCustomerData @sortbyVARCHAR(9), @sortdirection CHAR(4)

AS

SET nocount ON

SELECT customerid, firstname, lastname, statecode, statedescription, totalsales

FROM dbo.Customer

ORDER BY

CASE @sortdirection

WHEN 'asc' THEN

CASE @sortby

WHEN 'firstname' THEN firstname

WHEN 'lastname' THEN lastname

END

END

ASC,

CASE @sortdirection

WHEN 'desc' THEN

CASE @sortby

WHEN 'firstname' THEN firstname

WHEN 'lastname' THEN lastname

END

END

DESC

GO

EXEC dbo.getCustomerData'lastname', 'desc'

示例4:

最后一个例子中与示例3相似,我们需要改动存储过程去查找特定州的客户,如果该参数被忽略,则返回所有客户的所在州。

ALTERPROCEDUREdbo.getCustomerData@sortbyVARCHAR(9),@sortdirectionCHAR(4),@statecodeVARCHAR(2)=NULL
AS
SET
nocountON

SELECT
customerid,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'

分享到:
评论

相关推荐

    sqlserver约束详解

    sqlserver 数据库中主键,唯一键,外部键,约束键的创建与删除详解

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...

    SQL Server高级内容之case语法函数概述及使用

    1.Case函数的用法 (1)使用类似:switch-case与if-else if。 (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 else 显示数据 end (3)百分制转换素质教育 1)如图:我们要将显示的数据...

    《SQL进阶教程》第一章case表达式

    《SQL进阶教程》第一章case表达式 参考给出的代码,自己重写的代码配合文章使用,更佳最后说一句,SQL是世界上最好的语言,没有之一

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

    2.3 CASE表达式 2.4 NULL值 2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接...

    (第一卷)Microsoft.SQL.Server.2008技术内幕:T-SQL语言基础

    2.3 CASE表达式 2.4 NULL值 2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接 3.2 内联...

    Microsoft SQL Server 2005技术内幕:T-SQL查询

     2.3 CASE表达式  2.4 NULL值  2.5 同时操作(ALL-AT-ONCE OPERATION)  2.6 处理字符数据  2.7 处理日期和时间数据  2.8 查询元数据  2.9 总结  2.10 练习  2.11 解决方案 第3章 联接查询  3.1...

    SQL进阶教程 随书sql代码

    全书可分为两部分,第一部分介绍了SQL语言不同寻常的使用技巧,带领读者从SQL常见技术,比如CASE表达式、自连接、HAVING子句、外连接、关联子查询、EXISTS……去探索新发现。这部分不仅穿插讲解了这些技巧背后的逻辑...

    精通SQL--结构化查询语言详解

    7.3.4 使用case表达式 124 7.4 函数 126 7.4.1 有关函数的说明 126 7.4.2 字符处理函数 126 7.4.3 算术运算函数 131 7.4.4 日期时间函数 133 7.4.5 convert()函数转换日期、时间 136 第8章 聚合分析与分组 ...

    CASE表达式实现基于条件逻辑来返回一个值

    例如,以下对Products表的查询就在SELECT语句中使用了CASE表达式,以生成用于描述categoryid列取值的信息。 SQL代码如下: -- 设置数据库上下文 USE TSQLFundamentals2008; GO SELECT productid,productname,...

    CASE-Query-T-SQL:带有搜索的CASE表达式的SELECT语句

    案例查询-T-SQL 带有搜索的CASE表达式的SELECT语句

    精通SQL 结构化查询语言详解

    7.3.4 使用CASE表达式  7.4 函数  7.4.1 有关函数的说明  7.4.2 字符处理函数  7.4.3 算术运算函数  7.4.4 日期时间函数  7.4.5 CONVERT()函数转换日期、时间 第8章 聚合分析与分组  8.1 聚合分析...

    精通sql结构化查询语句

    7.6.7 数学运算符与集合运算符的组合应用 7.7 SQL中的表达式 7.7.1 CAST表达式的应用 7.7.2 CASE表达式的应用 7.8 小结第8章 SQL函数 8.1 SQL函数基础 8.1.1 SQL语句函数 8.1.2 常用的SQL语句函数 8.2 日期函数和...

    黄淮学院2010学年第二学期SQL server期末考试

    SQL server 中的变量分为两种,全局变量和局部变量。其中全局变量的名称以________ 字符开始,有系统定义和维护。局部变量以 _________ 字符开始,由用户自己定义和赋值。 一个事务的操作必须是具备以下四个属性:...

    mysql存储过程之case语句用法实例详解

    本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下: 除了if语句,mysql提供了一个替代的条件语句CASE。...我们可以使用简单CASE语句来检查表达式的值与一组唯一值的匹配,上述sql中,case_e

    Oracle Sql 性能优化

    Oracle Sql性能优化 解宝喆 1、选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在...

    Oracle高级sql学习与练习

    7、CASE表达式 8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、PARITION分区 16、并行操作 ...

    经典全面的SQL语句大全

    下列语句部分是Mssql语句,不可以在access中使用。  SQL分类:  DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  DCL—数据控制语言(GRANT,REVOKE,...

    SQL进阶知识笔记1

    1. 在 GROUP BY 子句里使用 CASE 表达式,可以灵活地选择作为聚合的单位编号或等级,在非定制化统计时能发挥 2. 在聚合函数中使用 CASE 表达

    最详细最全面的SQL入门笔记 包括各知识点的示例代码

    适合零基础小白学习的SQL入门知识。...3查询进阶、3.1 排序和分组、3.2 子查询、3.3 连接查询、3.4 CASE表达式; 4数据操纵语言和数据定义语言、4.1 复制和修改数据、4.2 使用视图、4.3 数据定义进阶、4.4 集合逻辑。

Global site tag (gtag.js) - Google Analytics