MS SQL ORDER BY ASC然后DESC用于地址

时间:2016-08-24 16:18:12

标签: sql sql-server sql-server-2008 sorting

我想在街上订购结果,然后返回另一边进行实地审查工作流程(100,102,104,105,103,101)。

我有:

ORDER BY 
    s.situs_street, 
    CAST([situs_num]%2 as integer), 
    CAST(situs_num as integer)

这让我获得了所有的优势,但是他们都在提升。

使用:

ORDER BY
    s.situs_street, 
    CAST([situs_num]%2 as integer) ASC, 
    CAST(situs_num as integer) DESC

将偶数/奇数降低。由于我反向排序相同的字段,因此使用CASE语句失败了。

2 个答案:

答案 0 :(得分:0)

使用case表达式对列进行排序,首先输入偶数,然后输入奇数。在分类的组中,在situs_num上再使用一种方法来获得所需的结果。

order by 
 s.situs_street
,case when cast([situs_num] as int)%2 = 0 then 1 else 2 end
,case when cast([situs_num] as int)%2 = 0 then cast([situs_num] as int) 
 else -cast([situs_num] as int) end

Sample demo

或更简单(如Matt所建议)

order by 
 s.situs_street
,cast([situs_num] as int)%2 --ordered by return value 0's first(even) and 1's next (odd)
,case when cast([situs_num] as int)%2 = 0 then cast([situs_num] as int) 
 else -cast([situs_num] as int) end

答案 1 :(得分:0)

ORDER BY s.situs_street
          ,CASE WHEN [situs_num]%2 = 0 THEN situs_num ELSE 9999999 END ASC
          ,CASE WHEN [situs_num]%2 <> 0 THEN situs_num ELSE -1 END DESC

如果你可以在没有先铸造的情况下取出situs_num的剩余部分,那么它已经是数字的。如果不是,你将不得不按如下方式进行投射

ORDER BY s.situs_street
          ,CASE WHEN CAST([situs_num] AS INT)%2 = 0 THEN  CAST([situs_num] AS INT) ELSE 9999999 END ASC
          ,CASE WHEN CAST([situs_num] AS INT)%2 <> 0 THEN  CAST([situs_num] AS INT) ELSE -1 END DESC