2010-11-24 28 views
1

如果我有一个以C,D和J开头的表格,它是否可以以任何方式安排一个查询,以便按升序排列,但以D开头,并以C结尾包起来?SQL搜索结果排序中的换行

E.g.原始表= C,C,C,D,D,J 所需结果顺序= D,D,J,C,C,C

在普通SQL中,这不是任何函数式语言?我看不出如何在没有硬编码的情况下实现所需的顺序,即按照所需顺序选择每个单独的记录并将所有联合在一起。

回答

1

这看起来不像常规订单,所以你不能以简单的方式来完成。但你可以这样做:

(SELECT * FROM yourtable WHERE ID >=C ORDER BY ID) UNION (SELECT SELECT * FROM yourtable WHERE ID <C ORDER BY ID) 
+0

非常接近我终于实现了,除了T-SQL,我不得不使用与派生表在联合部分中允许使用'ORDER BY'的顶部子句。幸运的是T-SQL允许动态TOP,所以我可以使用“select top(从Person中选择COUNT(*))* from Person”等等等等。确切的答案会在稍后发布。 – ProfK 2010-11-24 17:49:49

3

你可以引入一个CASE语句的自定义排序键。

Select Col1, Col2, Col3, 
     case left(Col3,1) when 'D' then 1 
         when 'J' then 2 
         when 'C' then 3 
         else 4 
     end as SortKey 
    from YourTable 
    order by SortKey, Col3 
1

您可以自定义实现的排序顺序,而不使用表硬编码:

CREATE TABLE SortRules (
    Prefix char(1) NOT NULL 
    ,SortOrder int NOT NULL 
) 

然后加入到SortRules表:

SELECT * 
FROM YourTable 
LEFT JOIN SortRules 
    ON YourTable.YourColumn LIKE SortRules.Prefix + '%' 
ORDER BY SortRules.SortOrder, YourTable.YourColumn 

您可以SortOrder的UNIQUE(虽然这不是需要)。您也可以决定是否要失踪者(在加入无与伦比的)是在顶部或底部:

SELECT * 
FROM YourTable 
LEFT JOIN SortRules 
    ON YourTable.YourColumn LIKE SortRules.Prefix + '%' 
ORDER BY COALESCE(SortRules.SortOrder, 2147483647), YourTable.YourColumn 

SELECT * 
FROM YourTable 
LEFT JOIN SortRules 
    ON YourTable.YourColumn LIKE SortRules.Prefix + '%' 
ORDER BY COALESCE(SortRules.SortOrder, -2147483648), YourTable.YourColumn