接上篇
四,根据条件有选择的UPDATE。
例,有如下更新条件
工资5000以上的职员,工资减少10%
工资在2000到4600之间的职员,工资增加15%
很容易考虑的是选择执行两次UPDATE语句,如下所示
--条件1
UPDATE Personnel
SET salary = salary * 0.9
WHERE salary >= 5000;
--条件2
UPDATE Personnel
SET salary = salary * 1.15
WHERE salary >= 2000 AND salary < 4600;
但是事情没有想象得那么简单,假设有个人工资5000块。首先,按照条件1,工资减少10%,变成工资4500。接下来运行第二个SQL时候,因为这个人的工资是4500在2000到4600的范围之内, 需增加15%,最后这个人的工资结果是5175,不但没有减少,反而增加了。如果要是反过来执行,那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞,如果想要一个SQL 语句实现这个功能的话,我们需要用到Case函数。代码如下:
UPDATE Personnel
SET salary = CASE WHEN salary >= 5000
THEN salary * 0.9
WHEN salary >= 2000 AND salary < 4600
THEN salary * 1.15
ELSE salary END;
这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。
这种方法还可以在很多地方使用,比如说变更主键这种累活。
一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。
p_key col_1 col_2
a 1 张三
b 2 李四
c 3 王五
假设有如上数据,需要把主键a和b相互交换。用Case函数来实现的话,代码如下
UPDATE SomeTable
SET p_key = CASE WHEN p_key = 'a'
THEN 'b'
WHEN p_key = 'b'
THEN 'a'
ELSE p_key END
WHERE p_key IN ('a', 'b');
同样的也可以交换两个Unique key。需要注意的是,如果有需要交换主键的情况发生,多半是当初对这个表的设计进行得不够到位,建议检查表的设计是否妥当。
五,两个表数据是否一致的检查。
Case函数不同于DECODE函数。在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而 实现更多的功能。
下面具个例子来说明,有两个表,tbl_A,tbl_B,两个表中都有keyCol列。现在我们对两个表进行比较,tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到, 返回结果'Matched',如果没有找到,返回结果'Unmatched'。
要实现下面这个功能,可以使用下面两条语句
--使用IN的时候
SELECT keyCol,
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
--使用EXISTS的时候
SELECT keyCol,
CASE WHEN EXISTS ( SELECT * FROM tbl_B
WHERE tbl_A.keyCol = tbl_B.keyCol )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。
六,在Case函数中使用合计函数
假设有下面一个表
学号(std_id) 课程ID(class_id) 课程名(class_name) 主修flag(main_class_flg)
100 1 经济学 Y
100 2 历史学 N
200 2 历史学 N
200 3 考古学 Y
200 4 计算机 N
300 4 计算机 N
400 5 化学 N
500 6 数学 N
有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。
现在我们要按照下面两个条件对这个表进行查询
只选修一门课程的人,返回那门课程的ID
选修多门课程的人,返回所选的主课程ID
简单的想法就是,执行两条不同的SQL语句进行查询。
条件1
--条件1:只选择了一门课程的学生
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*) = 1;
执行结果1
STD_ID MAIN_class
------ ----------
300 4
400 5
500 6
条件2
--条件2:选择多门课程的学生
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y' ;
执行结果2
STD_ID MAIN_class
------ ----------
100 1
200 3
如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示
SELECT std_id,
CASE WHEN COUNT(*) = 1 --只选择一门课程的学生的情况
THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flg = 'Y'
THEN class_id
ELSE NULL END
)
END AS main_class
FROM Studentclass
GROUP BY std_id;
运行结果
STD_ID MAIN_class
------ ----------
100 1
200 3
300 4
400 5
500 6
通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。
最后提醒一下使用Case函数的新手注意不要犯下面的错误
CASE col_1
WHEN 1 THEN 'Right'
WHEN NULL THEN 'Wrong'
END
在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。
原文地址
http://www.cnblogs.com/Ronin/archive/2006/07/20/455756.html
分享到:
相关推荐
代码如下: –简单Case函数 CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘2’ THEN ‘女’ ELSE ‘其他’ END –Case搜索函数 CASE WHEN sex = ‘1’ THEN ‘男’ WHEN sex = ‘2’ THEN ‘女’ ELSE ‘其他’ END 这两种...
在SQL Server中,有两种主要的方法可以实现这一转换: 1. 使用CASE语句: CASE语句是SQL中一个非常强大的逻辑表达式,它可以根据条件返回不同的值。在行转列中,我们可以用多个CASE语句来创建新的列,并根据原始...
本篇文章将详细解释如何通过一条SQL查询语句实现行列转换,并且会针对两种不同的SQL Server版本(SQL Server 2000和SQL Server 2005)来探讨具体的实现方法。 ### 数据准备 首先,我们需要构建一个简单的数据表...
在SQL Server中,实现行转列有多种方法,如PIVOT操作、动态SQL以及使用CASE语句。其中,CASE语句是一种灵活且通用的方法,适用于那些不支持PIVOT或需要动态生成列的场景。CASE语句允许我们在查询中根据条件创建新的...
在上面的代码中,我们使用了`CASE`语句来进行条件判断,并通过子查询的方式实现了拼音首字母的查找。需要注意的是,这里的拼音映射表仅提供了一部分常见的拼音首字母,实际应用中可能需要根据具体情况来完善这个映射...
Microsoft Query 是一种直观的工具,允许用户直接从 Excel 中访问外部数据源,并使用简单的图形界面来构建 SQL 查询。对于那些不熟悉 SQL 语言的用户来说,这是一种非常实用的方法。 **步骤详解:** 1. **启动 ...
本篇文章将深入探讨如何使用聚合函数Pivot和Unpivot来实现这一目标,特别是针对SQL Server数据库。 首先,让我们了解什么是行转列。行转列就是将表格中的某列值变为新的列名,而原本的行数据则对应到这些新列中。举...
要在.NET项目中使用SSIS API,需要首先添加对`Microsoft.SqlServer.DTSPipelineWrap.dll` 和 `Microsoft.SQLServer.ManagedDTS.dll` 的引用。通常,这些文件位于SQL Server安装目录下的` assemblies\GAC_MSIL` 子...
标题中的“动态多维度查询——sql”指的是在数据库管理中使用SQL(结构化查询语言)进行灵活、可扩展的多维度数据分析。SQL是用于管理和处理关系数据库的标准编程语言,它支持对数据进行增、删、改、查等操作。在多...
根据提供的信息来看,这篇文章主要涉及的是SQL中的行转列(Pivot)操作。在数据库管理中,有时我们需要将数据从一种格式转换成另一种格式来更好地分析或展示数据。特别是当原始数据以行的形式存在,而我们需要按列...
- `CASE`:在SQL中实现条件逻辑,类似于编程语言中的switch语句。 8. 循环: - `WHILE`:循环结构,当条件满足时重复执行代码块。 - `CONTINUE`:跳过当前循环迭代的剩余部分,继续下一次迭代。 - `BREAK`:...
参考文献是学习和研究的基石,对于基于SQL的二维统计分析方法,建议查阅以下几篇论文和指南: 1. "SQL Bible" by Anthony Rayner 2. "Database Systems: The Complete Book" by Hector Garcia-Molina, Jeffrey D. ...
本篇将详细介绍这款名为"SQL Server智能分析器RedGate_SQL_Prompt_V5.3.4.1"的工具,以及其提供的智能提示和其他强大功能。 首先,让我们了解什么是SQL智能提示。SQL智能提示是一种集成在开发环境中或者独立存在的...
这里也是先构造列名,但与动态SQL不同的是,PIVOT函数可以直接在查询中使用,无需执行额外的动态SQL。 #### 三、示例分析 为了更好地理解这两种方法,我们来看一个具体的例子。 假设有一个`Class`表,包含学生的...
本篇文章旨在介绍Oracle的核心组件——SQL与PL/SQL的基本概念及其在Oracle环境中的应用。 #### 二、SQL基础 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准语言。在Oracle...
这篇笔记主要涵盖了数字处理、日期操作、类型转换以及空值处理,还有CASE语句的使用,这些都是数据库查询和数据分析中的基本要素。 1. **数字函数**: - `ABS()`:这个函数用于返回一个数值的绝对值,例如`ABS(-5)...
根据提供的文件信息,本文将详细解释SQL语言中的各种核心概念及其使用方法,这些内容对于数据库管理及开发人员来说至关重要。 ### 数据操作 #### SELECT:从数据库表中检索数据行和列 - `SELECT * FROM table_name...
这篇文章旨在帮助开发人员将基于Oracle数据库的应用程序成功地转换为使用Microsoft SQL Server 7.0的系统。移植过程中涉及的关键知识点包括数据库的安装与配置、数据对象定义、数据完整性和商业规则、事务处理、SQL...