我想知道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。
答案 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
我正在测试并调查这种行为