ORDER BY 高级用法之CASE WHEN
今天在公司查看一段sql SP代码,发现了一段比较奇怪的代码。
大概长这样子:
Select * from tableA
ORDER BY ColA ,
CASE
WHEN type = 5
THEN 200
WHEN type = 6
THEN 300
END
小弟才疏学浅,咋一看到代码以为这样的:
Select * from tableA
WHERE type=5
ORDER BY ColA ,200
但是执行报错,同时也忘记了 order by 后面加数字是什么意思了。。。
果断查了一下:
示例1:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY salary DESC;
示例2:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY 2 DESC;
以上两个示例结果相同。
因为ORDER BY salary DESC==ORDER BY 2 DESC
salary是第二个元素,所以可以使用2来代替。
但是数字不可以使用0,也不可以超出查询的列。
例如:select * from employers
order by x;
如果employers表有九个字段,那个X的范围就是1---9
不能是0,也不能是10.
原来order by后面跟数字是代表以第几列排序的意思。
但是SP 中 用的是200...甚至300....没这么多列啊。。。
事实证明 order by 后面用case when 并不等于 order by 数字
查了相关资料,并且找个一个表来测试,
无 CASE WHEN
ORDER BY 后面不使用 CASE WHEN
测试sql代码
SELECT [ServerId]
,[ServerCode]
,[InBound]
,[OutBound]
,[IP]
,[PhoneArea]
,[Valid]
FROM [ServerInfo] with(nolock)
ORDER BY Location
查询结果

我们可以看到IP 为192.168.130.81 的排在第一位
一个CASE WHEN
加上 CASE WHEN 当IP 为 192.168.130.85 时,我们返回100,其他返回1000.
代码如下
SELECT [ServerId]
,[ServerCode]
,[InBound]
,[OutBound]
,[IP]
,[PhoneArea]
,[Valid]
FROM [ServerInfo] with(nolock)
ORDER BY Location
,CASE
WHEN IP='192.168.130.85'
THEN 100
ELSE 1000
END
执行结果

我们可以看到IP 为192.168.130.81 的已经不再第一位了,192.168.130.85 的被排在了第一位。
因为IP等于192.168.130.85的我们返回了100 ,不等于192.168.130.85 的我们返回了1000
100比1000小,所以192.168.130.85 的被排在了第一位。
两个CASE WHEN
我们在加一个 CASE WHEN 当IP等于192.168.130.87 时,我们返回2,其他返回10.
代码如下
SELECT [ServerId]
,[ServerCode]
,[InBound]
,[OutBound]
,[IP]
,[PhoneArea]
,[Valid]
FROM [ServerInfo] with(nolock)
ORDER BY Location
,CASE
WHEN IP='192.168.130.85'
THEN 100
ELSE 1000
END
,CASE
WHEN IP='192.168.130.87'
THEN 2
ELSE 10
END
我们可以猜一下执行结果。
第一个CASE WHEN 当IP等于192.168.130.85的我们返回了100 ,不等于192.168.130.85 的我们返回了1000
第二个CASE WHEN 当IP等于192.168.130.87的我们返回了2 ,不等于192.168.130.87 的我们返回了10
结果应该 192.168.130.87 被排在第一 ,因为第一个case when返回1000 但是被第二个CASE WHEN返回是2覆盖掉了,2最小的,所以排在第一。
哈哈哈。。。就是这样。。。
其实,执行结果是这样的。

我们可以看到192.168.130.85 被排在第一,
192.168.130.87被排在第二。
其实两个CASE WHEN是相互不影响的。
其实两个CASE WHEN的sql 结果等价于下面的sql
SELECT [ServerId]
,[ServerCode]
,[InBound]
,[OutBound]
,[IP]
,[PhoneArea]
,[Valid]
,CASE
WHEN IP='192.168.130.85'
THEN 100
ELSE 1000
END AS MYORDER1
,CASE
WHEN IP='192.168.130.87'
THEN 2
ELSE 10
END AS MYORDER2
FROM [ServerInfo] with(nolock)
ORDER BY Location , MYORDER1,MYORDER2
好了,就这样!!!
ORDER BY 高级用法之CASE WHEN的更多相关文章
- Linux之shell脚本for、while、case语句的高级用法
1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...
- sqlalchemy(二)高级用法
sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...
- Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...
- fw:sed的高级用法
转的,找不到原创了.... sed高级用法 <收藏> 首先,应该明白模式空间的定义.模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的.这对接下来 的学习是有帮助 ...
- SQL[连载3]sql的一些高级用法
SQL[连载3]sql的一些高级用法 SQL 高级教程 SQL SELECT TOP SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP ...
- LinqToXml高级用法介绍
LinqToXml高级用法介绍 一.函数构造 什么是函数构造?其是指通过单个语句构建XML树的能力. 那么它有什么作用呢? 作用1.用单个表达式快速创建复杂的XML树 见实例代码CreateXml( ...
- Python 内置函数sorted()在高级用法
对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...
- Python之Requests的高级用法
# 高级用法 本篇文档涵盖了Requests的一些更加高级的特性. ## 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个Session实例发出的所有请求之间保持cookies. 会话对象 ...
- 爬虫 requests模块高级用法
一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内 ...
随机推荐
- .net core2.0 codefirst 创建数据库的问题!
appsettings.json和Startup.cs就不记录了,网上很多!! 1.必须在有DbContext类的项目里添加这3个NuGet引用 Microsoft.EntityFrameworkCo ...
- c# 协变与抗变
定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用 ...
- c#与c++类型
C/C++ C# HANDLE, LPDWORD, LPVOID, void* IntPtr LPCTSTR, LPCTSTR, LPSTR, char*, const char*, Wchar_t* ...
- 知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
本文由 网易云发布. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学 ...
- idea破解方式 附jar包
在安装了idea之后 去安装目录找到安装目录的 idea.exe.vmoptions 和 idea64.exe.vmoptions 两个文件在文件最后面追加上 -javaagent:C:/破解补丁的名 ...
- JSOI2010 满汉全席
题目链接:戳我 一个2-SAT的模板题. (什么是2-SAT呢?就是解决一个情况两种决策的问题,我们根据"选了其中一个点A就必须选一个点B的原则,从A向B连边.最后判断如果在一个强连通分量里 ...
- SpingBoot的认识和基本使用
认识SpingBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程. -使用springboot以后,搭建一个spring应 ...
- django 视图中执行原生的 sql 查询语句
可以使用objects的raw()方法执行原生的sql语句,进行对数据库的查询操作,raw()方法只能执行查询语句 query_set = your_model.objects.raw("s ...
- jQuery基础笔记(3)
day55 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-8-0 操作标签 样式操作 样式类 addClass();// 添 ...
- js事件委托 jQuery写法
http://www.cnblogs.com/liugang-vip/p/5616484.html 不是抄的,这篇文章写的细 这是js 事件委托写法 <!DOCTYPE html> < ...