1. 程式人生 > >case when 中的 order by

case when 中的 order by

今天在公司檢視一段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