我使用的是SQL Server,列是VARCHAR(50)
,我想这样排序:
1A
1B
2
2
3
4A
4B
4C
5A
5B
5C
5N
14 Draft
21
22A
22B
23A
23B
23C
23D
23E
25
26
FR01584
MISC
到目前为止,我拥有的是:
Select *
From viewASD
ORDER BY
Case When IsNumeric(LEFT(asdNumNew,1)) = 1
Then CASE When IsNumeric(asdNumNew) = 1
Then Right(Replicate('0',20) + asdNumNew + '0', 20)
Else Right(Replicate('0',20) + asdNumNew, 20)
END
When IsNumeric(LEFT(asdNumNew,1)) = 0
Then Left(asdNumNew + Replicate('',21), 20)
End
但这个SQL语句将“14草案”放在“26”之后。
有人能帮忙吗?谢谢
5条答案
按热度按时间pinkon5k1#
你的WHERE语句非常复杂。
看起来您想按整数顺序按任何前导数字排序,然后按余数排序。如果是这样的话,你应该把它作为单独的条款来做,而不是试图把它全部放在一起。你面临的具体问题是,你只允许一个数字,而不是两个或更多。(还有No such thing as two。)
这是您的修复,以及SQLFiddle,使用两个单独的计算列测试ORDERBY。(请注意,这假设
asdNumNew
的数字部分适合T-SQL int
。如果不适合,则需要调整第一个ELSE上的CAST和最大值。)goqiplq22#
如果字符串中的所有数字都相当小,例如不超过10位,则可以将字符串中的数字扩展为正好10位:
123A->0000000 123A
A3B89->A0000000003B0000000089
依此类推,然后对它们进行排序
ldfqzlk83#
我有一些类似的东西,但可能有破折号作为前导字符和尾随空格。这个代码对我有效。
3ks5zfa04#
试试这个
nmpmafwu5#
对我有用的是我将数字和字母部分分开,然后根据字母排序,然后根据数字排序: