在SELECT中删除非数字字符

时间:2012-09-24 11:03:30

标签: sql regex ms-access ms-access-2007

在MS Access 2007项目报告中,我有以下(编辑)查询:

SELECT SomeCol FROM SomeTable

问题是,SomeCol显然包含一些不可见的字符。例如,我看到一个结果返回为123456,但SELECT LEN(SomeCol)返回7。当我将结果复制到Notepad ++时,它显示为?123456

该列设置为TEXT。我无法控制这种数据类型,所以我无法改变它。

如何修改SELECT查询以删除任何非数字查询。我怀疑RegEx是可行的方式......或者,是否有CASTCONVERT函数?

4 个答案:

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

结束功能