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. 记一次ckeditor上传图片到服务器问题

    package com.util;import java.io.IOException; import java.io.PrintWriter; import java.util.List;impor ...

  2. TINYINT,SMALLINT,MEDIUMINT,INT,INTEGER,BIGINT;text,longtext,mediumtext,ENUM,SET等字段类型区别

    http://www.path8.net/tn/archives/951 MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述, ...

  3. Openfire重新安装

    由于忘记密码等原因,无法启动openfire ,那就重装吧,废话不多说,命令行按步骤粘贴执行就好了. 1.先删除mysql数据 mysql -u root -p 输入密码:例如,123456 show ...

  4. 一次Debug过程的思考

    前一段时间,部门接入了新业务,由于业务量小,架构非常简单,采用了最简单的LNMP架构,整个项目是交给一个刚毕业的RD负责的,这是背景. 上线前半天,服务平稳运行.下午的时候,开始收到大量报警:No h ...

  5. Java继承中成员方法的overload(重载/过载)

    如果Java基础类有一个方法名被"过载"使用多次,在衍生类里对那个方法名的重新定义就不会隐藏任何基础类的版本.所以无论方法在这一级还是在一个基础类中定义,过载都会生效. publi ...

  6. 剖析信用卡 DCC 交易

    摘要: 所谓DCC交易(Dynamic Currency Conversion,直译:动态货币转换 ),或者叫CPC交易(Cardholder Preferred Currency,直译:持卡人选定货 ...

  7. java web学习总结(一) -------------------基本概念

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  8. easyui datagrid toolbar 添加搜索框

    最近用到了就研究了下,效果  把列名稍加转换放入menubtton,对于单项搜索来说还是非常方便的 var fields =  $('#tt').datagrid('getColumnFields') ...

  9. Restive.js – 轻松让网站变成响应式和自适应

    Restive.js 是一个 jQuery 插件,可以帮助您轻松快捷地添加响应式功能到你网站,适应几乎所有拥有 Web 功能的设备.使用设备检测,高级管理断点,以及方向管理的组合,Restive.js ...

  10. ICSharpCode.SharpZipLib简单使用

    胡乱做了个小例子,记录下来,以便后面复习. using System; using System.Collections.Generic; using System.Linq; using Syste ...