2008-12-29 43 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