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. Rest.Ler PHP API Server解决方案

    https://github.com/Luracast/Restler 通过composer安装依赖后,整个vendor将近三十兆.这太不爽了.搞PHP的人如果没有洁癖的追求,跟搞Java的咸鱼有神码 ...

  2. 动易CMS之标签管理

    一.如何添加一个标签 1.系统设置->模板标签管理->添加标签 2.输入标签名称,根据需要选择数据设置: sql语句则选择[系统数据库SQL查询] 3.添加参数 4.系统可以根据设置的条件 ...

  3. 算法:欧几里得求最大公约数(python版)

    #欧几里得求最大公约数 #!/usr/bin/env python #coding -*- utf:8 -*- #iteration def gcd(a,b): if b==0: return a e ...

  4. Guava学习笔记:Range

    在Guava中新增了一个新的类型Range,从名字就可以了解到,这个是和区间有关的数据结构.从Google官方文档可以得到定义:Range定义了连续跨度的范围边界,这个连续跨度是一个可以比较的类型(C ...

  5. angular学习的一些小笔记(中)之基础ng指令

    一.布尔属性指令: ng-disabled:就是ng-disabled=true-->就指向不可用 <!doctype html> <html ng-app="&qu ...

  6. 原生JS实现轮播+学前端的感受(防止走火入魔)

    插件!插件!天天听到有人求这个插件,那个插件的,当然,用第三方插件可以大幅提高开发效率,但作为新手,我还是喜欢自己来实现,主要是我有时间! 今天我来给大家分享下用原生JS实现图片轮播的写法 前辈们可以 ...

  7. [Android]使用Kotlin开发Android(二)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html [TOC] 使用Kotlin+OkHtt ...

  8. MySQL 安装 启动 基本语法概述

    MySQL 安装 启动 基本语法概述 MySQL安装和配置 我是直接使用安装包:mysql-installer-community-5.6.10.1.msi 安装的时候其中有几点要注意: 1.记住端口 ...

  9. sqlite3 not found问题解决方法

    测试发现,有些Android手机自带sqlite3命令,有些不带.对于不带sqlite3的手机,我们可以手动将sqlite3加入系统. 执行如下命令 adb remount adb push 路径/s ...

  10. 优化MySchool数据库(三)

    使用T_SQL 编写业务逻辑: 如何定义及使用“变量”: ---- 让电脑帮我记住一个名字(王二) C#: string   name ;    [定义一个变量] name = "王二&qu ...