在MS Access 2007项目报告中,我有以下(编辑)查询:
SELECT SomeCol FROM SomeTable
问题是,SomeCol
显然包含一些不可见的字符。例如,我看到一个结果返回为123456
,但SELECT LEN(SomeCol)
返回7
。当我将结果复制到Notepad ++时,它显示为?123456
。
该列设置为TEXT
。我无法控制这种数据类型,所以我无法改变它。
如何修改SELECT
查询以删除任何非数字查询。我怀疑RegEx是可行的方式......或者,是否有CAST
或CONVERT
函数?
答案 0 :(得分:9)
您提到过使用正则表达式。确实,Access的db引擎不直接支持正则表达式。但是,您似乎愿意在查询中使用VBA用户定义的函数......并且UDF可以使用正则表达式方法。与迭代输入字符串的每个字符并仅存储您希望保留在新输出字符串中的字符相比,该方法应该简单,容易且执行速度更快。
Public Function OnlyDigits(ByVal pInput As String) As String
Static objRegExp As Object
If objRegExp Is Nothing Then
Set objRegExp = CreateObject("VBScript.RegExp")
With objRegExp
.Global = True
.Pattern = "[^\d]"
End With
End If
OnlyDigits = objRegExp.Replace(pInput, vbNullString)
End Function
以下是立即窗口中该函数的示例,其中“x”字符作为不可见字符的代理。 (“数字”字符类中未包含的任何字符将被丢弃。)
? OnlyDigits("x1x23x")
123
如果这是您想要的输出,只需在查询中使用该功能。
SELECT OnlyDigits(SomeCol) FROM SomeTable;
答案 1 :(得分:2)
Access中没有RegEx,至少在SQL中没有。如果您冒险使用VBA,也可以在SQL语句中使用自定义的StripNonNumeric VBA函数。
e.g。 SELECT StripNonNumeric(SomeCol) as SomeCol from SomeTable
Function StripNonNumeric(str)
keep = "0123456789"
outstr = ""
For i = 1 to len(str)
strChar = mid(str,i,1)
If instr(keep,strChar) Then
outstr = outstr & strChar
End If
Next
StripNonNumeric = outstr
End Function
答案 2 :(得分:0)
您可以在查询中完成所有操作,将此问题与previous question相结合,即可获得:
SELECT IIf(IsNumeric([atext]),
IIf(Len([atext])<4,Format([atext],"000"),
Replace(Format(Val([atext]),"#,###"),",",".")),
IIf(Len(Mid([atext],2))<4,Format(Mid([atext],2),"000"),
Replace(Format(Val(Mid([atext],2)),"#,###"),",","."))) AS FmtNumber
FROM Table AS t;
答案 3 :(得分:0)
Public Function fExtractNumeric(strInput) As String
' Returns the numeric characters within a string in
' sequence in which they are found within the string
Dim strResult As String, strCh As String
Dim intI As Integer
If Not IsNull(strInput) Then
For intI = 1 To Len(strInput)
strCh = Mid(strInput, intI, 1)
Select Case strCh
Case "0" To "9"
strResult = strResult & strCh
Case Else
End Select
Next intI
End If
fExtractNumeric = strResult
结束功能