case 这个关键词,用的地方不少~大部分的用途都通过以下的方式去应用

DECLARE @i INT = 3

SELECT  CASE @i
WHEN 1 THEN 1
WHEN 2 THEN 2
WHEN 3 THEN 3
END AS 测试1; 测试1
-----------
3 DECLARE @Hour INT = DATEPART(hh,GETDATE()) SELECT CASE WHEN @Hour BETWEEN 7 AND 12 THEN '早上好'
WHEN @Hour >= 12 AND @Hour < 18 THEN '下午好'
WHEN @Hour > 18 AND @Hour < 24 THEN '晚上好'
ELSE '深夜了' END AS 问候 问候
------
早上好

这个已经用得炉火纯青╮(╯_╰)╭的小伙伴请不要鄙视我。

补充说一下,第一个查询和第二个查询的区别是第二个查询有一个else ,这个else 是用来处理当都匹配不上的值。如果没有else 的处理,如第一个例子的@i = 4 的时候,表达式将返回 Null。

再给一个例子,简单创建一个员工表,然后通过使用case 可以做一些自定义的规则,这里是按部门,优先是秘书处,然后开发部,然后人事部,最后其它部门不分先后,再根据入职时间来一个排序。

CREATE TABLE #Employee (ID INT IDENTITY(1,1),DeparmentName NVARCHAR(50),Name NVARCHAR(50),EntryDate DATETIME)

INSERT INTO #Employee
( DeparmentName, Name, EntryDate )
VALUES ( N'人事部',N'Joey', '2015-04-12'),
( N'开发部',N'John', '2013-04-23'),
( N'秘书处',N'Mery', '2012-03-17'),
( N'人事部',N'Anna', '2014-05-07'),
( N'秘书处',N'Dave', '2011-01-12'),
( N'开发部',N'Alex', '2012-03-03') SELECT *
FROM #Employee
ORDER BY CASE DeparmentName WHEN '秘书处' THEN 1
WHEN '开发部' THEN 2
WHEN '人事部' THEN 3
ELSE 4 END,EntryDate ID DeparmentName Name EntryDate
----------- -------------------------------------------------- -------------------------------------------------- -----------------------
5 秘书处 Dave 2011-01-12 00:00:00.000
3 秘书处 Mery 2012-03-17 00:00:00.000
6 开发部 Alex 2012-03-03 00:00:00.000
2 开发部 John 2013-04-23 00:00:00.000
4 人事部 Anna 2014-05-07 00:00:00.000
1 人事部 Joey 2015-04-12 00:00:00.000

使用case 还是要注意一些语法上面的使用,首先是联机文档里面提到的2个

1 case 的嵌套上限是10

2  以下这个栗子是会执行报0除的错误的。因为 1/value 存在0,所以要注意执行的时候是需要注意表达式的值,不应依赖聚合后的值和when 的顺序,这将会出现意外的结果。

WITH Data (value) AS
(
SELECT 0
UNION ALL
SELECT 1
)
SELECT
CASE
WHEN MIN(value) <= 0 THEN 0
WHEN MAX(1/value) >= 100 THEN 1
END
FROM Data ;

3 注意then 后面的表达式,比如我将前面的查询语句修改一下。因为then 后面的数据类型隐式转换失败,就会报下面的错误,所以这个要小心

SELECT *
FROM #Employee
ORDER BY CASE DeparmentName WHEN '秘书处' THEN 1
WHEN '开发部' THEN 'a' --修改为'a'
WHEN '人事部' THEN 3
ELSE 4 END,EntryDate 消息 245,级别 16,状态 1,第 12 行
在将 varchar 值 'a' 转换成数据类型 int 时失败。

4 不光是 then 后面的 ,when 后面的值也需要注意数据类型的一致性。上述的例子如果将 开发部改成 1(不是 '1'),错误也成立 。

5 还有一种特殊的情况,在case 里面使用函数,每次都会重新调用一次。比如以下一个例子

DECLARE @i INT = 1,
@j INT DECLARE @T AS TABLE (I INT)
WHILE @i < 100
BEGIN
SELECT @j = CASE WHEN CAST(RAND()*10 AS INT)%3 = 0 THEN 0
WHEN CAST(RAND()*10 AS INT)%3 = 1 THEN 1
WHEN CAST(RAND()*10 AS INT)%3 = 2 THEN 2 END,
@i = @i + 1
INSERT INTO @T
( I )
VALUES ( @j )
END
SELECT I,COUNT(*)
FROM @T
GROUP BY I I
----------- -----------
NULL 27
0 34
1 24
2 14

( Null???Null怎么会出来的?? rand()*10 % 3 只有 (0,1,2) 3种情况啊!!你挺萌的在逗我?)

其实是这个样纸的,看一下语句,case 里面,没匹配一项,都需要将case when 里面的条件判断一次,所以每次都会执行一次 Rand()*10 这个表达式,导致可以非 1,2,3 的值粗线!如果要稳定,那就改成这样

DECLARE @i INT = 1,
@j INT DECLARE @T AS TABLE (I INT)
WHILE @i < 100
BEGIN
SELECT @j = CAST(RAND()*10 AS INT) ,
@j = CASE @j%3 WHEN 0 THEN 0
WHEN 1 THEN 1
WHEN 2 THEN 2 END,
@i = @i + 1
INSERT INTO @T
( I )
VALUES ( @j )
END
SELECT I,COUNT(*)
FROM @T
GROUP BY I I
----------- -----------
0 40
1 24
2 35

看!这就没有了Null 了~

然后~这就说完了╮(╯_╰)╭

小说一下case ~的更多相关文章

  1. 1103简单SQL 行转列思路

    转自http://www.cnblogs.com/lhj588/p/3315876.html -- 经典行列转化DROP TABLE IF EXISTS TabName;CREATE TABLE Ta ...

  2. Mysql 列转行统计查询 、行转列统计查询

      -- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...

  3. switch……case不能匹配字符串的方法 .xml

    pre{ line-height:1; color:#d1653c; background-color:#000000; font-size:16px;}.sysFunc{color:#566d68; ...

  4. 【原创】小说:我是一条DQL

    SQL执行流程图如下 本文改编自<高性能Mysql>,烟哥用小说的形式来讲这个内容. 序章 自我介绍 我是一条sql,就是一条长长的字符串,不要问我长什么样,因为我比较傲娇. 额~~不是我 ...

  5. httpclient+jsoup实现小说线上采集阅读

    前言 用过老版本UC看小说的同学都知道,当年版权问题比较松懈,我们可以再UC搜索不同来源的小说,并且阅读,那么它是怎么做的呢?下面让我们自己实现一个小说线上采集阅读.(说明:仅用于技术学习.研究) 看 ...

  6. 学习笔记CB012: LSTM 简单实现、完整实现、torch、小说训练word2vec lstm机器人

    真正掌握一种算法,最实际的方法,完全手写出来. LSTM(Long Short Tem Memory)特殊递归神经网络,神经元保存历史记忆,解决自然语言处理统计方法只能考虑最近n个词语而忽略更久前词语 ...

  7. Python的scrapy之爬取顶点小说网的所有小说

    闲来无事用Python的scrapy框架练练手,爬取顶点小说网的所有小说的详细信息. 看一下网页的构造: tr标签里面的 td 使我们所要爬取的信息 下面是我们要爬取的二级页面 小说的简介信息: 下面 ...

  8. 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第四节:小说网站采集

    之前的章节,我们陆续的介绍了使用C#制作爬虫的基础知识,而且现在也应该比较了解如何制作一只简单的Web爬虫了. 本节,我们来做一个完整的爬虫系统,将之前的零散的东西串联起来,可以作为一个爬虫项目运作流 ...

  9. C#中,switch case语句中多个值匹配一个代码块的写法

    switch (num) { case 1: Response.Write("1"); break; case 2: case 3: Response.Write("2| ...

随机推荐

  1. Firemonkey 控件设定字型属性及颜色

    将控件 StyledSettings 的勾取消(如此才能自定样式及字型,如果勾选则依 Style 而定). 设定 TextSettings 里的 Font 属性. 使用代码寫法: CheckBox1. ...

  2. 改变 TMemo 的背景颜色 (Firemonkey)

    说明:展示使用程序码改变 Firemonkey TMemo 的背景颜色. 适用:XE6 源码下载:[原創]Memo改背景色_XE6.zip //---------------------------- ...

  3. VS使用WinRAR软件以命令行方式打包软件至一个exe

    由于项目需要,需要将一个绿色版软件(即无需在C盘写入文件)发给客户使用,要求是只有一个exe文件,双击即可执行.​ 网上说WinRAR软件创建自解压文件可以实现,链接http://blog.csdn. ...

  4. 第 22 章 CSS3 渐变效果

    学习要点: 1.线性渐变 2.径向渐变 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 背景渐变功能,主要有两种渐变方式:线性渐变和径向(放射性)渐变. 一.线性渐变 CSS3 提供了 li ...

  5. Oracle Database 11g For Windows7 旗舰版的安装

    系统环境:win7 32位系统 安装步骤: 1,Oracle(甲骨文)官网下载适合自己的数据库安装包,下载地址http://www.oracle.com/technetwork/cn/indexes/ ...

  6. Scalaz(16)- Monad:依赖注入-Dependency Injection By Reader Monad

    在上一篇讨论里我们简单的介绍了一下Cake Pattern和Reader Monad是如何实现依赖注入的.主要还是从方法上示范了如何用Cake Pattern和Reader在编程过程中解析依赖和注入依 ...

  7. (学习笔记)HTML的<link>标签

    在HTML中<link>标签用于定义文档与外部资源的关系. <link>标签只存在于head部分. <head> <link rel="styles ...

  8. Python WMI获取Windows系统信息 监控系统

    #!/usr/bin/env python # -*- coding: utf-8 -*- #http://www.cnblogs.com/liu-ke/ import wmi import os i ...

  9. 【转】Linux重定向操作符

    Linux重定向操作符 功能描述 > 将命令输出写入文件或设备,而不是命令提示符或句柄,清空原有文件然后写入 < 从文件而不是从键盘或句柄读入命令输入 >> 将命令输出添加到文 ...

  10. 代码验证浏览器是否支持html audio 和video

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...