MS Access排序列,包含文本和数字

时间:2013-04-17 07:37:36

标签: sorting ms-access text numbers

我需要正确排序Access2010 Query中的列。它是一个包含字符串的Textcolumn,其数字类似于“CRMPPC1”。文本长度可能在列中有所不同。

当我对它进行排序时,它看起来像

CRMPPC1
**CRMPPC10**
CRMPPC2
CRMPPC3
CRMPPC4
....

但我需要的是

CRMPPC1
CRMPPC2
CRMPPC3
CRMPPC4
....
**CRMPPC10**

有人能帮助我(最好是用SQL)吗?我尝试了VAL,CAST等各种方法,但到目前为止没有任何工作。

2 个答案:

答案 0 :(得分:1)

如果文本前缀中的字符数是可变的,那么我认为没有纯粹的Access SQL解决方案,而是VBA函数

Public Function ExtractNumber(textString As Variant) As Long
Dim s As String, i As Long
s = Nz(textString, "")
For i = 1 To Len(s)
    Select Case Mid(s, i, 1)
        Case "0" To "9"
            Exit For
    End Select
Next
If i > Len(s) Then
    ExtractNumber = 0
Else
    ExtractNumber = Val(Mid(s, i))
End If
End Function

允许您使用像这样的查询

SELECT textTest.*
FROM textTest
ORDER BY ExtractNumber([textColumn]);

答案 1 :(得分:0)

尝试使用这个' hack'用于自然排序。它只适用于两个字符,但您可以更多地修改它。

''''最后只能使用最后两个字符编号。如果你有三个数字,它将会突然发生,''''''

函数PadNumberForNatSort(strToMod)As String

If IsNumeric(Right(strToMod, 1)) = True Then
    If IsNumeric(Mid(strToMod, Len(strToMod), 1)) = True And IsNumeric(Mid(strToMod, Len(strToMod) - 1, 1)) = True Then
        PadNumberForNatSort = strToMod
    Else
        PadNumberForNatSort = Mid(strToMod, 1, Len(strToMod) - 1) & "0" & Mid(strToMod, Len(strToMod), 1)
    End If
Else
    PadNumberForNatSort = strToMod
End If

结束功能

在您的SQL中:ORDER BY PadNumberForNatSort([column_name])