我有以下记录,需要相应地对它们进行排序:
AB*1
AB*2
AB*10
AB*100
我正在使用以下完美运行的SQL语句,但仅适用于过滤到特定条件的记录。
SELECT Column1
FROM dbo.Table1
ORDER BY LEN(Column1), Column1
WHERE Column1 Like 'AB*'
当我删除示例中的Where子句时,记录AB * 100显示在下面。很明显,它将所有记录组合在一起,长度为4,然后从长度为5的记录开始,依此类推。
是否可以在将星号组合在一起并正确排序之前对它们进行排序?
答案 0 :(得分:2)
第一个字符“按字母顺序”实际上是“没有字符”。所以并不是说“一串4首先出现”。例如,以下是......
AB*1
AB*2
AB*10
AB*100
CD*1
CD*2
CD*10
CD*100
你可以按前3个字符作为字符串排序,将尾随字符作为数字排序。只要你的数据表现如何......
ORDER BY
LEFT(column1, 3),
CLNG(MID(column1, 4, 8000))
或者您可以填写您的值并将它们命名为,就像它们看起来像这样......
AB*100
AB*10Z
AB*1ZZ
AB*2ZZ
使用这种ORDER BY语句......
ORDER BY
column1 & string(8000 - LEN(column1), "z")
但是这些都是强制执行'非自然'排序的解决方法,因为目前你正在获得'正确'的排序。
答案 1 :(得分:1)
SELECT Column1
FROM dbo.Table1
ORDER BY left(Column1,2), LEN(Column1)
答案 2 :(得分:1)
这可能很慢:
ORDER BY Mid(Column1,1,Instr(Column1,"*"))
编辑重新评论
SELECT Column1
FROM Table
ORDER BY Mid([Column1],1,InStr([Column1],"*")),
Val(Mid([Column1],InStr([Column1],"*")+1));
测试中使用的示例数据:
ID
ab*1
ab*10
ab*2
abcdef*a1
abcdef*10
abcdef*40a
对于null,只需添加一些零长度字符串。
SELECT column1
FROM Table
ORDER BY Mid([column1] & "",1,InStr([column1] & "","*")),
Val(Mid([column1] & "",InStr([column1] & "","*")+1));