我需要正确排序Access2010 Query中的列。它是一个包含字符串的Textcolumn,其数字类似于“CRMPPC1”。文本长度可能在列中有所不同。
当我对它进行排序时,它看起来像
CRMPPC1
**CRMPPC10**
CRMPPC2
CRMPPC3
CRMPPC4
....
但我需要的是
CRMPPC1
CRMPPC2
CRMPPC3
CRMPPC4
....
**CRMPPC10**
有人能帮助我(最好是用SQL)吗?我尝试了VAL,CAST等各种方法,但到目前为止没有任何工作。
答案 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])