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#检测并安装https站点的数字证书,CefSharp和HttpWebRequest通过会话Cookie实现自动登录访问https站点
HttpUtil工具类: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...
- westrac server security configure user info
security userkey:westracpass:Set#@!123
- Commons FileUpload文件上传组件
Java实现的文件上传组件有好几种,其中最为“官方”的要数Apache Commons库中的FileUpload了吧. 页面 <form method="POST" enct ...
- jsp的九大内置对象(查询资料,搬砖所得)
此笔记大部分摘自大神https://www.cnblogs.com/SimonHu1993/,部分通过网上搜寻补充. 1.Request内置对象(类型:HttpServletRequest 表示 ...
- Cordova - Windows版本图形界面管理工具,告别命令行输入方式!
Cordova本身提供的是命令行管理工具,并没有提供图形界面管理工具,虽然命令行管理工具可以完成所有Cordova管理,但是对于我这种懒蛋,可真不希望每次都输入命令,而且我更担心一旦输错一个字符,命令 ...
- 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
站长之家(Chinaz.com)5月20日消息 近日,PHP被爆出存在远程DOS漏洞,若黑客利用该漏洞构造PoC发起连接,容易导致目标主机CPU被迅速消耗.此漏洞涉及众多PHP版本,因而影响范围极大 ...
- MongoDB系统CentOS 7.1 crash的排障过程
[作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 最近我们有多台MongoDB的服务器CentOS 7.1系统发生了cr ...
- Tomcat几种出错方法
1. Several ports (8005, 8089, 8009) required by Tomcat v8.0 Server at localhost are already in use. ...
- 项目实体类使用@Data注解,但是项目业务类中使用getA(),setA()方法报错,eclipse中配置lombok
@Data注解来源与Lombok,可以减少代码中大量的set get方法,大量减少冗余代码,但是今天部署项目时候,发现实体类使用@Data注解,但是项目业务类中使用getA(),setA()方法报错. ...
- CentOS7搭建FastDFS V5.11分布式文件系统-第一篇
1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...