小说一下case ~
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 ~的更多相关文章
- 1103简单SQL 行转列思路
转自http://www.cnblogs.com/lhj588/p/3315876.html -- 经典行列转化DROP TABLE IF EXISTS TabName;CREATE TABLE Ta ...
- Mysql 列转行统计查询 、行转列统计查询
-- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...
- switch……case不能匹配字符串的方法 .xml
pre{ line-height:1; color:#d1653c; background-color:#000000; font-size:16px;}.sysFunc{color:#566d68; ...
- 【原创】小说:我是一条DQL
SQL执行流程图如下 本文改编自<高性能Mysql>,烟哥用小说的形式来讲这个内容. 序章 自我介绍 我是一条sql,就是一条长长的字符串,不要问我长什么样,因为我比较傲娇. 额~~不是我 ...
- httpclient+jsoup实现小说线上采集阅读
前言 用过老版本UC看小说的同学都知道,当年版权问题比较松懈,我们可以再UC搜索不同来源的小说,并且阅读,那么它是怎么做的呢?下面让我们自己实现一个小说线上采集阅读.(说明:仅用于技术学习.研究) 看 ...
- 学习笔记CB012: LSTM 简单实现、完整实现、torch、小说训练word2vec lstm机器人
真正掌握一种算法,最实际的方法,完全手写出来. LSTM(Long Short Tem Memory)特殊递归神经网络,神经元保存历史记忆,解决自然语言处理统计方法只能考虑最近n个词语而忽略更久前词语 ...
- Python的scrapy之爬取顶点小说网的所有小说
闲来无事用Python的scrapy框架练练手,爬取顶点小说网的所有小说的详细信息. 看一下网页的构造: tr标签里面的 td 使我们所要爬取的信息 下面是我们要爬取的二级页面 小说的简介信息: 下面 ...
- 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第四节:小说网站采集
之前的章节,我们陆续的介绍了使用C#制作爬虫的基础知识,而且现在也应该比较了解如何制作一只简单的Web爬虫了. 本节,我们来做一个完整的爬虫系统,将之前的零散的东西串联起来,可以作为一个爬虫项目运作流 ...
- C#中,switch case语句中多个值匹配一个代码块的写法
switch (num) { case 1: Response.Write("1"); break; case 2: case 3: Response.Write("2| ...
随机推荐
- Software Development Engineer - Database Services
http://stackoverflow.com/jobs/116486/software-development-engineer-database-services-amazon?med=clc& ...
- WebView的使用及添加进度条
实现的效果比较简单类似于微信打开网页,头部有个进度条显示加载进度 下载地址:http://download.csdn.net/detail/qq_29774291/9666941 1.在安卓端加载一个 ...
- 对于 Web 开发很有用的 jQuery 效果制作教程
如果你的项目中需要响应式滑块,炫丽的图片呈现,对话框提示,轻巧动画等效果,jQuery 是完美的解决方案.凭借这个快速,易用的 JavaScript 库,可以轻松处理语言之间的交互,它给人最快速的 W ...
- 学习使用 SVG 创建材料设计涟漪(Ripple)效果
Codrops 上面发布了一个深入的教程,就如何建立谷歌材料设计的径向操作规范中列出的涟漪效果,并基于 SVG 和 GreenSock 来实现.随着谷歌的材料设计的出现,带来了一个视觉语言,创建跨平台 ...
- 【2015上半年总结】js开源组件开发系列索引
js开源组件开发系列一索引 2015.8 by 田想兵 个人网站 从3月份进入新公司以来,时经五个月,我以平均每周1个小组件的速度,已经完成的js组件有22个之余了,已基本上全部用到实际项目中,这些小 ...
- 关于处理addGiftmoneyAction接口报错问题的总结
昨天UniUser中AddGiftmoneyAction接口在被调用时抛出异常,曾哥让我来解决这个问题,虽然最后查出是路径问题,但是由于解决问题 的思路不够清晰,导致浪费了大量的时间和精力,也没有给出 ...
- JavaScript事件对象
一. 事件对象 事件处理三部分组成:对象.事件处理函数=函数.例如:单击文档任意处. 1.鼠标按钮 非 IE(W3C)中的 button 属性 0 表示主鼠标按钮(常规一般是鼠标左键) 1 表示中间的 ...
- ReactNative ScrollView或ListView头部莫名其妙多了20px
之前在还没有加TabBarIOS时,ScrollView一直是好好的,然后随着深入,需要做其他tab页面的时候问题来了,当我把首页加入TabBarIOS.Item时..我首页中的ScrollView头 ...
- 学习zepto.js(原型方法)[1]
新的一周,新的开始,今天来学习一下zepto里边的原型方法,就是通过$.进行调用的方法,也是可以通过$.fn进行扩展的方法: $.camelCase(): 方法接收一个字符串,将连字符格式的字符串转为 ...
- JSOM 对User的操作
一.操作当前用户 //Load current user info function LoadCurUser() { var curUser; curUser = curWeb.get_current ...