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库发送请求将网页内 ...
随机推荐
- C#实现墨卡托投影坐标系经纬度与米制单位之间的互转
using System; using GeoJSON.Net.Geometry; namespace GISWebService.Common { /// <summary> /// 墨 ...
- 4月第4周业务风控关注 | 网络犯罪经济每年1.5万亿美元 GDP居全球第12位
本文由 网易云发布. 易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.网络 ...
- 1007. Minimum Domino Rotations For Equal Row
In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. (A domi ...
- linux文件系统底层原理
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 底层原理图: 在讲解各个 ...
- day 32 css后续补充以及js 简单入门
前情提要: 利用html 和css ,js 模拟小米的官网(待做) 一:第一个sj利子 <!DOCTYPE html> <html lang="en"> & ...
- easyUI的分页,只显示第X 共Y页。改为显示 第X 页 共Y页
如下图,easyUI的分页,只显示第X 共Y页. 需求需要显示 第X 页 共Y页. 解决办法:在easyui-lang-zh_CN.js更改以下代码,即可.也就是在 “共{pages}页”前面加个 “ ...
- Sublime Text 3快捷键的使用技巧(python)
Sublime Text 3非常实用,但是想要用好,一些快捷键不可或缺,所以转了这个快捷键汇总. 先拉出来说几个切身体会最常用, Ctrl+Z 撤销. Ctrl+Y 恢复撤销 Alt+Shift+2 ...
- Apache JMeter2.13 实战
安装目录下 设置浏览器代理127.0.0.1 8080,以chrome为例 开始录制脚本,进入应用点击相应的功能,可以捕获到如下地址 去除无用地址,保留需要测试的地址 注:上图编号列表中11为获取co ...
- Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown works.
我是 win7 64位 解决办法: 1, win+r 快捷键打开 “运行”,输入regedit 打开注册表 2,找到 HKEY_CLASSES_ROOT\CLSID\{00020420-0000-00 ...
- 手淘的移动端适配方案flexible
基于 vue-cli 配置手淘的 lib-flexible + rem,实现移动端自适应 安装 flexible npm install lib-flexible --save 引入 flexible ...