SQL 服务器排序奇数 ASC 和偶数 DESC

SQL Server sorting odd numbers ASC and even numbers DESC

我想知道 SQL 服务器中是否有一种方法可以对 table 进行排序,该 table 在 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。

一个技巧是用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

假设门牌号有一个合理的上限,您可以使用以下方法:

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;

对于偶数值,它使用门牌号。通过翻转奇数的符号,它们以相反的顺序排序,但需要一个偏移量才能让它们在偶数之后排序。

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

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

我正在测试和调查此行为