Ms access 2007 忽略其他字符进行列比较

Ms access 2007 忽略其他字符进行列比较,ms-access-2007,Ms Access 2007,如何通过忽略其他字符(如“,”来比较MS Access中的两列 例如,以下两列数据应相符 Col1 Col2 "adA.'kd," adA.kd 感谢您的回复 谢谢如果您只需要忽略几个字符,您可以使用空字符串来尝试它们。更好的方法是使用正则表达式替换,例如,您的正则表达式模式(在您的情况下,patrn变量将是正则表达式“[,”\”],以忽略句点、逗号、单引号和双引号(但我不确定Escape在MS Access中是如何工作的),replStr应该是“”,空字符串)如果只有几个

如何通过忽略其他字符(如“,”来比较MS Access中的两列

例如,以下两列数据应相符

Col1         Col2

"adA.'kd,"  adA.kd
感谢您的回复


谢谢

如果您只需要忽略几个字符,您可以使用空字符串来尝试它们。更好的方法是使用正则表达式替换,例如,您的正则表达式模式(在您的情况下,
patrn
变量将是正则表达式“[,”\”],以忽略句点、逗号、单引号和双引号(但我不确定Escape在MS Access中是如何工作的),
replStr
应该是“”,空字符串)

如果只有几个字符可以忽略,可以用空字符串来尝试。更好的方法是用正则表达式替换,比如,你的正则表达式模式在哪里(在您的例子中,
patrn
变量将是regex“[,”\“]”以忽略句点、逗号、单引号和双引号(但我不确定在MS Access中转义如何工作),而
replStr
将只是“”,即空字符串)

如果您打算使用regex,则可以使用字符类
\W
(替换为<代码> [^ \W] < /代码>),表示任何非单词字符。这不包括数字和下划线。如果要替换这些,则考虑<代码> [^ -ZA-Z] ;也就是,任何不是字母的东西。

访问函数包括
Replace
,但这不是很有用,因为它不允许我们指定要替换的一组字符。如果使用访问查询执行比较,则可以创建一个VBA函数,可在查询中使用,如下所示

Function GetAlpha(strInput As String) As String
    'Returns a string containing only the letters from the input
    Dim strCheck As String
    Dim i As Integer
    Dim iLen As Integer
    Dim strOutput As String
    Dim ch As String

    strCheck = strInput   'remember the original input
    strInput = LCase(strInput)    'ignore case temporarily
    iLen = Len(strInput)
    For i = 1 To iLen
        ch = Mid(strInput, i, 1)
        If ch >= "a" And ch <= "z" Then
            'if a letter, build a string using the original letter from the input
            strOutput = strOutput & Mid(strCheck, i, 1)
        End If
    Next i
    GetAlpha = strOutput
End Function
Access忽略大小写。如果您不想包含大小写敏感度,则也可以使用
StrComp()
,或者修改我的函数以包含两个(字符串)参数并返回布尔值。您可以使用以下方法而不是修改函数:

Function CompareAlpha(strInput1 As String, strInput2 As String) As Boolean
    'case-insensitive comparison of the letters of two strings
    CompareAlpha = (StrComp(GetAlpha(strInput1), GetAlpha(strInput2), _
        vbBinaryCompare) = 0)
End Function
下面的函数与上面的GetAlpha()完全相同,但可能稍微简洁一些:

Function GetAlpha(strInput As String) As String
    Dim i As Integer
    Dim iLen As Integer
    Dim strOutput As String
    Dim ch As String

    iLen = Len(strInput)
    For i = 1 To iLen
        ch = LCase(Mid(strInput, i, 1))
        If ch >= "a" And ch <= "z" Then
            strOutput = strOutput & Mid(strInput, i, 1)
        End If
    Next i
    GetAlpha = strOutput
End Function

如果你打算使用正则表达式,那么你可以在替换中使用字符类<代码> \W/COD>(等价于<代码> [^ \W] < /代码>),这意味着任何非单词字符。这不包括数字和下划线。如果要替换这些,则考虑<代码> [^ -Z-Z] ;即,任何不是字母的东西。

访问函数包括
Replace
,但这不是很有用,因为它不允许我们指定要替换的一组字符。如果使用访问查询执行比较,则可以创建一个VBA函数,可在查询中使用,如下所示

Function GetAlpha(strInput As String) As String
    'Returns a string containing only the letters from the input
    Dim strCheck As String
    Dim i As Integer
    Dim iLen As Integer
    Dim strOutput As String
    Dim ch As String

    strCheck = strInput   'remember the original input
    strInput = LCase(strInput)    'ignore case temporarily
    iLen = Len(strInput)
    For i = 1 To iLen
        ch = Mid(strInput, i, 1)
        If ch >= "a" And ch <= "z" Then
            'if a letter, build a string using the original letter from the input
            strOutput = strOutput & Mid(strCheck, i, 1)
        End If
    Next i
    GetAlpha = strOutput
End Function
Access忽略大小写。如果您不想包含大小写敏感度,则也可以使用
StrComp()
,或者修改我的函数以包含两个(字符串)参数并返回布尔值。您可以使用以下方法而不是修改函数:

Function CompareAlpha(strInput1 As String, strInput2 As String) As Boolean
    'case-insensitive comparison of the letters of two strings
    CompareAlpha = (StrComp(GetAlpha(strInput1), GetAlpha(strInput2), _
        vbBinaryCompare) = 0)
End Function
下面的函数与上面的GetAlpha()完全相同,但可能稍微简洁一些:

Function GetAlpha(strInput As String) As String
    Dim i As Integer
    Dim iLen As Integer
    Dim strOutput As String
    Dim ch As String

    iLen = Len(strInput)
    For i = 1 To iLen
        ch = LCase(Mid(strInput, i, 1))
        If ch >= "a" And ch <= "z" Then
            strOutput = strOutput & Mid(strInput, i, 1)
        End If
    Next i
    GetAlpha = strOutput
End Function

字符不需要在正则表达式字符类中转义;也就是说,在方括号中转义。也就是说,特殊字符除外]\^-。即使如此,通常也可以通过在字符类中适当地定位字符来避免转义。(其他字符可以用反斜杠“\”转义,但这在字符类中是不必要的。)谢谢大家,非常感谢。很抱歉反应太晚。嗨,安迪,如果我想直接比较两列,我该怎么做?我这样做是
…其中GetAlpha(a.ACol4)=GetAlpha(B.BCol4);
这两个
Col4
都是文本。但是它给出了一个
数据类型不匹配错误
。我将示例数据输入为
。这两个列的sddll
很可能您的一些值为空,而GetAlpha()需要一个字符串。我已添加到我的答案中以处理空值。@Andy,如果您不介意的话,请稍作澄清。我使用了以下查询
从RegexMatch(ACol4,“screw.*d+\s*mm”)的表a中选择ACol3,ACol4
。我在ACol4列中使用了以下数据。
平头螺钉长度18 mm,螺钉18 mm,您好
。但这并不是真的。我只是想找出问题所在。字符不需要在正则表达式字符类中转义;也就是说,在方括号中。也就是说,除了特殊字符以外]\^-。即使如此,转义也可以ng通常可以通过在character类中适当地定位来避免。(其他字符可以用反斜杠“\”转义,但在character类中这不是必需的。)谢谢大家,真的很感谢。很抱歉反应太晚。嗨,安迪,如果我想直接比较两列,我该怎么做呢?我是这样做的
…其中GetAlpha(A.ACol4)=GetAlpha(B.BCol4);
这两个
Col4
都是文本。但是它给出了一个
数据类型不匹配错误
。我将示例数据输入为
。这两个列的sddll
很可能您的一些值为空,而GetAlpha()需要一个字符串。我已添加到我的答案中以处理空值。@Andy,如果您不介意的话,请稍作澄清。我使用了以下查询
从RegexMatch(ACol4,“screw.*d+\s*mm”)的表a中选择ACol3,ACol4
。我在ACol4列中使用了以下数据。
盘头螺钉长度18mm,螺钉18mm,您好
。但这并不是真的。我只是想找出问题所在。