我正在使用SQL Server,该列为a VARCHAR(50),我想像这样对它进行排序:
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 Draft”放在“ 26”之后。
有人可以帮忙吗?谢谢
您的WHERE陈述很复杂。
看来您想按整数顺序对所有前导数字进行排序,然后再对其余部分进行排序。如果是这样,则应将其作为单独的子句进行操作,而不是尝试一并完成。您遇到的特定问题是,您只允许输入一个数字,而不是两个或多个。(并且没有两个这样的东西。)
这是您的修复,以及一个SQLFiddle,对您的ORDER BY使用了两个单独的计算列测试。(请注意,这假定的数字部分asdNumNew将适合T-SQL int。如果不正确,则需要在第一个ELSE上调整CAST和最大值。)
asdNumNew
T-SQL int
SELECT * FROM viewASD ORDER BY CASE WHEN ISNUMERIC(asdNumNew)=1 THEN CAST(asdNumNew as int) WHEN PATINDEX('%[^0-9]%',asdNumNew) > 1 THEN CAST( LEFT( asdNumNew, PATINDEX('%[^0-9]%',asdNumNew) - 1 ) as int) ELSE 2147483648 END, CASE WHEN ISNUMERIC(asdNumNew)=1 THEN NULL WHEN PATINDEX('%[^0-9]%',asdNumNew) > 1 THEN SUBSTRING( asdNumNew, PATINDEX('%[^0-9]%',asdNumNew) , 50 ) ELSE asdNumNew END