ORDER BY 高級用法之CASE WHEN


今天在公司查看一段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

 

好了,就這樣!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM