排序文本字段

时间:2012-03-16 13:31:33

标签: sql ms-access

我有以下记录,需要相应地对它们进行排序:

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的记录开始,依此类推。

是否可以在将星号组合在一起并正确排序之前对它们进行排序?

3 个答案:

答案 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));