8

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

SELECT SomeCol FROM SomeTable

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

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

如何修改我的SELECT查询以去除任何非数字。我怀疑 RegEx 是要走的路……或者,是否有CASTorCONVERT功能?

4

4 回答 4

10

您提到为此使用正则表达式。Access的数据库引擎确实不直接支持正则表达式。但是,您似乎愿意在查询中使用 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;
于 2012-09-24T18:16:57.440 回答
2

Access 中没有 RegEx,至少 SQL 中没有。如果您冒险使用 VBA,您不妨在 SQL 语句中使用自定义 StripNonNumeric VBA 函数。

例如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
于 2012-09-24T11:37:56.207 回答
0

您可以在查询中完成所有操作,将此问题与您之前的问题结合起来,您会得到:

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;
于 2012-09-24T11:50:51.443 回答
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

结束功能

于 2016-10-28T07:07:02.347 回答