如果我有一个以C,D和J开头的表格,它是否可以以任何方式安排一个查询,以便按升序排列,但以D开头,并以C结尾包起来?SQL搜索结果排序中的换行
E.g.原始表= C,C,C,D,D,J 所需结果顺序= D,D,J,C,C,C
在普通SQL中,这不是任何函数式语言?我看不出如何在没有硬编码的情况下实现所需的顺序,即按照所需顺序选择每个单独的记录并将所有联合在一起。
如果我有一个以C,D和J开头的表格,它是否可以以任何方式安排一个查询,以便按升序排列,但以D开头,并以C结尾包起来?SQL搜索结果排序中的换行
E.g.原始表= C,C,C,D,D,J 所需结果顺序= D,D,J,C,C,C
在普通SQL中,这不是任何函数式语言?我看不出如何在没有硬编码的情况下实现所需的顺序,即按照所需顺序选择每个单独的记录并将所有联合在一起。
这看起来不像常规订单,所以你不能以简单的方式来完成。但你可以这样做:
(SELECT * FROM yourtable WHERE ID >=C ORDER BY ID) UNION (SELECT SELECT * FROM yourtable WHERE ID <C ORDER BY ID)
你可以引入一个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
您可以自定义实现的排序顺序,而不使用表硬编码:
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
非常接近我终于实现了,除了T-SQL,我不得不使用与派生表在联合部分中允许使用'ORDER BY'的顶部子句。幸运的是T-SQL允许动态TOP,所以我可以使用“select top(从Person中选择COUNT(*))* from Person”等等等等。确切的答案会在稍后发布。 – ProfK 2010-11-24 17:49:49