2010-10-08 121 views
13

MySQL提供一個名爲FIELD()的字符串函數,它接受可變數量的參數。返回值是剩餘列表中第一個參數的位置。換句話說:什麼是類似於MySQL FIELD()函數的MS SQL Server功能?

FIELD('d', 'a', 'b', 'c', 'd', 'e', 'f') 

會返回4,因爲'd'是第一個後面的第四個參數。

此函數提供了基於非常特定的排序對查詢結果進行排序的功能。對於我目前的應用程序,我需要管理四種狀態:活動,批准,拒絕和提交。但是,如果我只是通過狀態欄來訂購,我覺得結果列表的可用性會減少,因爲被拒絕和活躍的狀態項目比提交和批准的項目更重要。

在MySQL中我可以這樣做:

SELECT <stuff> FROM <table> WHERE <conditions> ORDER BY FIELD(status, 'rejected', 'active','submitted', 'approved') 

,其結果將被排序,使得不合格的項目是第一,其次是活躍的,等等。因此,結果對訪問者的重要性下降。

我可以創建一個單獨的表,列出狀態的重要性級別,然後按降序排列查詢,但是自從切換到MS SQL Server後,這已經出現了幾次,所以我想我' d詢問我是否可以使用與MySQL的FIELD()類似的內置函數來避免額外的表和更復雜的查詢。

謝謝
戴維·基斯

回答

19

使用CASE expression(SQL服務器2005 +):

ORDER BY CASE status 
      WHEN 'active' THEN 1 
      WHEN 'approved' THEN 2 
      WHEN 'rejected' THEN 3 
      WHEN 'submitted' THEN 4 
      ELSE 5 
     END 

你可以使用這個語法更復雜的評價(包括組合,或者如果你需要使用LIKE)

ORDER BY CASE 
      WHEN status LIKE 'active' THEN 1 
      WHEN status LIKE 'approved' THEN 2 
      WHEN status LIKE 'rejected' THEN 3 
      WHEN status LIKE 'submitted' THEN 4 
      ELSE 5 
     END 
+0

真棒的東西!謝謝。 – 2010-10-08 19:20:25

0

我推薦CTE(SQL server 2005+)。 無需重複狀態碼或創建單獨的表格。

WITH cte(status, RN) AS ( -- CTE to create ordered list and define where clause 
     SELECT 'active', 1 
UNION SELECT 'approved', 2 
UNION SELECT 'rejected', 3 
UNION SELECT 'submitted', 4 
) 
SELECT <field1>, <field2> 
FROM <table> tbl 
INNER JOIN cte ON cte.status = tbl.status -- do the join 
ORDER BY cte.RN -- use the ordering defined in the cte 

祝你好運,

傑森

相關問題