SQLServer使用case when中的order by

風靈使發表於2018-12-11

今天發現了一段比較奇怪的程式碼。

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

1001000小,所以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 WHENsql 結果等價於下面的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

相關文章