2008-12-29 76 views
12

我有一個sql查詢(使用Firebird作爲RDBMS),其中需要按字段排序結果。但是,我需要按照該領域的內容進行排序。即「NE」先走,「OE」走第二,「OP」走第三,空白走最後。不幸的是,我不知道如何實現這一點。我所做過的所有事情都是[字段] ASC/DESC,而沒有別的。按特定字段值排序SQL查詢

有什麼建議嗎?

編輯:我真的應該澄清:我只是希望在這裏瞭解更多。我現在擁有它,我只是有多個選擇語句來定義首先顯示哪個語句。查詢是相當大的,我真的很希望能有可能學習這樣做的更多effecient方式: 例如:

SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='NE' 
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OE' 
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OP' 
UNION (etc...) 
+0

Ñ建議的解決方案之一需要多個選擇/聯合。他們都應該更快,更容易維護,查詢將更容易閱讀。 – 2008-12-29 20:15:27

+0

我和Peter LaComb一起參加這個節目。你爲什麼使用UNION?沒有必要 我會用SELECT * FROM Retail WHERE MTITLE LIKE'somethi%'和版本在('NE','OE','OP','')ORDER BY CASE EDITION當'NE'Then 1當'OE'然後2當'OP'然後3其他4結束 – Pulsehead 2008-12-30 16:01:02

+0

@Pulsehead你可以找到答案,爲什麼我會在這個非常瞭解StackOverflow問題的地方使用聯合關於不知道排序字段的最佳方式。 – Cyprus106 2015-12-09 18:57:35

回答

40
Order By Case Edition 
    When 'NE' Then 1 
    When 'OE' Then 2 
    When 'OP' Then 3 
    Else 4 End 
5

這些值添加到另一個表爲他們的等級數字列:

Edition Rank 
NE  1 
OE  2 
OP  3 

加入表格,然後在RANK字段上排序。

+0

沒錯。如果它不是永久的需求或經常改變,那麼OP可以使用臨時表/表變量。 – StingyJack 2008-12-29 19:48:01

5
SELECT 
    /*other fields*/ 
    CASE WHEN 'NE' THEN 1 
    WHEN "OE" THEN 2 
    WHEN "OP" THEN 3 
    ELSE 4 
END AS OrderBy 
FROM 
    /*Tables*/ 
WHERE 
    /*conditions*/ 
ORDER BY 
    OrderBy, 
    /*other fields*/ 
2

嘗試:

select * 
from MyTable 
order by 
case [FIELD] 
    when 'NE' then 1 
    when 'OE' then 2 
    when 'OP' then 3 
    when '' then 4 
    else 5 
end 
0

嘗試這種情況:

ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,') 
0
CREATE TABLE #TMP 
(
     ID INT IDENTITY(1,1), 
     NAME VARCHAR(100), 
) 

INSERT INTO #TMP 
SELECT 'ASHISH' 
UNION ALL 
SELECT 'CHANDAN' 
UNION ALL 
SELECT 'DILIP' 
UNION ALL 
SELECT 'ESHA' 
UNION ALL 
SELECT 'FIZA' 
UNION ALL 
SELECT 'MAHESH' 
UNION ALL 
SELECT 'VIPUL' 
UNION ALL 
SELECT 'ANIL' 

-- I want to sort NAME column from value 'DILIP' then query will be as bellow 

SELECT * FROM #TMP ORDER BY CASE WHEN NAME='DILIP' THEN '1' ELSE NAME END ASC 

DROP TABLE #TMP 

更多細節click here