SQLServer使用case when中的order by
今天發現了一段比較奇怪的程式碼。
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
其實,執行結果是這樣的。
我們可以看到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
相關文章
- sqlserver使用order by case when進行優先順序排序SQLServer排序
- Oracle的order by case whenOracle
- mysql中case when的使用MySql
- SQL中的CASE WHEN使用SQL
- 【專案實戰】---SQLServer中case when的簡單用法SQLServer
- mysql case when then 使用MySql
- mysql中的case when 與if()MySql
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法Oracle
- sql中case when的小學SQL
- 案例:oracle中case when的用法Oracle
- SQL Case when 的使用方法SQL
- sqlserver與oracle case when else ,isnull語法差別SQLServerOracleNull
- SQL中的case when then else end用法SQL
- Oracle Case WhenOracle
- SQL Case WhenSQL
- MySQL 的CASE WHEN 語句使用說明MySql
- Case when 支援變數變數
- case when遇上null值Null
- 136-MySQL5.17 update更新[case when then end]的使用MySql
- oracle plsql case when_end case小記OracleSQL
- SQL中的case when then else end用法 【詳細】轉載SQL
- Oracle case when改寫SQLOracleSQL
- ORACLE多欄位CASE WHENOracle
- PL/SQL Case when應用SQL
- sql case when, Exist ,group by ,聚合SQL
- SQL Server CASE WHEN ... THEN ... ELSE ... ENDSQLServer
- sql server select case when的用法SQLServer
- plsql_case when_end case學習小例SQL
- plsql_case when_if else endifSQL
- oracle面試題[關於case when的用法]Oracle面試題
- where條件中使用case when來實現不同列的join
- MySQL中case?when對NULL值判斷的踩坑記錄RTGYMySqlNull
- Oracle vs PostgreSQL Develop(30) - Index&Case whenOracleSQLdevIndex
- ORA-00937——Oracle中GROUP BY搭配CASE WHEN的一則SQL報錯OracleSQL
- SQL語句case when外用sum與count的區別SQL
- PLSQL條件(CASE WHEN)語句小應用SQL
- ORACLE SQL開發where子句之case-whenOracleSQL
- Oracle 條件索引 case when 報錯解決方案Oracle索引