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排序
- mysql中case when的使用MySql
- case when 語句
- sql case when, Exist ,group by ,聚合SQL
- Oracle case when改寫SQLOracleSQL
- SQL Server CASE WHEN ... THEN ... ELSE ... ENDSQLServer
- SQL中的case when then else end用法 【詳細】轉載SQL
- MySQL中case?when對NULL值判斷的踩坑記錄RTGYMySqlNull
- Oracle vs PostgreSQL Develop(30) - Index&Case whenOracleSQLdevIndex
- SQL語句case when外用sum與count的區別SQL
- When Rubber Meets the Road: Unveiling the Curious Case of Volvo Truck Engine Failures!AI
- Oracle 條件索引 case when 報錯解決方案Oracle索引
- 在CSS中如何使用 when/elseCSS
- 雲端計算學習路線圖素材、課件,msyql中CASE WHEN語法
- Oracle group by與case when統一單位後統計數量Oracle
- 語法解析器續:case..when..語法解析計算
- drools中的條件 when
- SQLServer索引優化(1):對於有order by欄位的建索引策略SQLServer索引優化
- MySQL中union和order by同時使用的實現方法MySql
- Golang switch case 的使用注意點Golang
- 如何使用使用 HAVING 與 ORDER BY?
- java中的switch case語句Java
- MySQL中ORDER BY與LIMIT一起使用(有坑)MySqlMIT
- oracle order by索引是否使用的情況Oracle索引
- Django筆記二十三之case、when操作條件表示式搜尋、更新等操作Django筆記
- 使用select,兩個case 讀取 同一個chan 中的資料,兩個case都可能被執行到
- SQLServer臨時表的使用SQLServer
- SqlServer遊標的建立與使用SQLServer
- sqlserver 使用總結SQLServer
- MySQL按指定順序排序(order by field的使用)MySql排序
- SAP MM Return Purchase Order之使用
- 消除程式碼中的 if-else/switch-case
- Sqlserver中的儲存過程SQLServer儲存過程
- 說明Hive中order by,sort by,distribute by,cluster by的作用Hive
- js 學習之路7:switch/case語句的使用JS
- SqlServer觸發器的建立與使用SQLServer觸發器
- Playwright使用Typescript實現在測試case檔案中呼叫另一個檔案中的方法TypeScript
- 瞭解GaussDB SQL中CASE表示式SQL