今天在公司查看一段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
好了,就這樣!!!