SQL Server排序奇数ASC和偶数DESC

时间:2018-07-12 03:01:29

标签: sql sql-server tsql select sql-order-by

我想知道SQL Server中是否有一种方法可以对在varchar列中保存数字的表进行排序。我去了,然后将数字(在我的情况下是门牌号码)转换为Int并使用

order by cast([sano]%2 as int), cast([sano] as Int)

实际创建2,4,6,8 ...,1,3,5,7,9的输出,依此类推。但是我需要得到像2,4,6,8..9,7,5,3,1这样的输出,所以偶数是asc,而奇数是desc。

3 个答案:

答案 0 :(得分:6)

一种技巧是使用case表达式将奇数乘以-1,从而首先以升序获得绝对值最大的那些:

ORDER BY CAST([sano] % 2 AS INT), 
         CAST([sano] AS INT) * CASE CAST([sano] % 2 AS INT) WHEN 0 THEN 1 ELSE -1 END

答案 1 :(得分:1)

假设门牌号的上限合理,则可以使用以下代码:

declare @Samples as Table ( HouseNumber Int );
insert into @Samples ( HouseNumber ) values
  ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 );

select HouseNumber,
  case HouseNumber % 2 when 0 then HouseNumber else 1000000 - HouseNumber end as SortValue
  from @Samples
  order by case HouseNumber % 2 when 0 then HouseNumber else 1000000 - HouseNumber end;

对于偶数,它使用门牌号。通过翻转奇数的符号,它们以相反的顺序排序,但是需要偏移以使其在偶数之后排序。

答案 2 :(得分:0)

这似乎可行,但我不知道为什么

select *
from test
order by CASE WHEN sano%2=0 THEN sano%2 END ASC

我正在测试并调查这种行为