Sql &引用;查询太复杂";:MS Access函数替换查询中的文本(嵌套替换())

Sql &引用;查询太复杂";:MS Access函数替换查询中的文本(嵌套替换()),sql,ms-access,replace,Sql,Ms Access,Replace,用途:在MS Access中使用SQL查询查找与长文本字段中特定关键字匹配的所有记录 我试图查询MS Access数据库中与字段中特定关键字列表匹配的所有记录。关键词如下: UCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLA

用途:在MS Access中使用SQL查询查找与长文本字段中特定关键字匹配的所有记录

我试图查询MS Access数据库中与字段中特定关键字列表匹配的所有记录。关键词如下:

UCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(a.REF_CONTENT_NM,chr(13)," "),chr(10)," "),"`"," "),"~"," "),"!"," "),"@"," "),"#"," "),"$"," "),"%"," "),"^"," "),"&"," "),"*"," "),"("," "),")"," "),"-"," "),"_"," "),"="," "),"+"," "),"["," "),"{"," "),"]"," "),"}"," "),";"," "),":"," "),","," "),"<"," "),"."," "),">"," "),"/"," "),"?"," "),"\"," "),"|"," "),""""," ")) like "* AIN *"
艾因、阿廷、CKD、阿基、ARF

我所遇到的问题是字段是一个自由文本输入字段,所以数据的格式化在整个地方,并且我正在搜索的关键字经常出现在其他全长单词的中间(即AIN匹配在“疼痛”、“再”等)上,而我只想在严格的关键字上包含匹配(即,关键字)。“AIN”、“AKI”)

我的想法是简单地包括符合以下格式的匹配:字段名称,如“*AIN*”。因此基本上只包括关键字前后有空格的匹配,以限制结果集中出现的误报数量

我已经尝试编写一个SQL查询来规范化数据,以便将出现的所有其他字符(“.”、“!”、“?”、“#”等)替换为空格字符(即,“AIN!”将被替换(字段名称“!”、“)=“AIN”)考虑到这应该只包括只包含关键字的单词。在尝试在查询中运行很长的嵌套替换语句时,我收到了“query Too Complex”消息。嵌套替换如下所示:

UCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(a.REF_CONTENT_NM,chr(13)," "),chr(10)," "),"`"," "),"~"," "),"!"," "),"@"," "),"#"," "),"$"," "),"%"," "),"^"," "),"&"," "),"*"," "),"("," "),")"," "),"-"," "),"_"," "),"="," "),"+"," "),"["," "),"{"," "),"]"," "),"}"," "),";"," "),":"," "),","," "),"<"," "),"."," "),">"," "),"/"," "),"?"," "),"\"," "),"|"," "),""""," ")) like "* AIN *"
替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换替换@
我认为一种解决方法是创建一个可以在SQL语句中引用的自定义函数,但我不完全确定如何实现这一点。因此,从本质上讲,我想了解如何评估一种解决方案,以规范化Access中的文本,如上面嵌套的replace语句,而不必运行“查询太复杂的消息”。我觉得这里有一个简单的解决方案,我只是没有看到,所以非常感谢您的指导!

编写自定义函数的主要技巧是正确使用
ParamArray

这是一个执行多个替换的小函数:

Public Function ReplaceMultiple(strInput As String, strReplace As String, ParamArray Find() As Variant) As String
    Dim i As Long
    ReplaceMultiple = strInput
    For i = LBound(Find) To UBound(Find)
        ReplaceMultiple = Replace(ReplaceMultiple, Find(i), strReplace)
    Next
End Function
实施它:

ReplaceMultiple(a.REF_CONTENT_NM, " ", chr(13), chr(10), "`", "etc....")
不过,您可能需要考虑完全更改逻辑,例如保留一个应替换的字符表。我记得最大参数数约为20-30,因此您可能需要使用
ReplaceMultiple
两次

如果您只想用空格替换所有非字符串的内容,可以尝试以下小函数:

Public Function ReplaceNonAlphanumeric(str As String) As String
    If str = "" Then Exit Function
    Dim i As Long
    For i = 1 To Len(str)
        If Mid(str, i, 1) Like "[0-9A-z]" Then
            ReplaceNonAlphanumeric = ReplaceNonAlphanumeric & Mid(str, i, 1)
        Else
            ReplaceNonAlphanumeric  = ReplaceNonAlphanumeric  & " "
        End If
    Next
End Function

我认为这个答案会解决你的问题@AshrafAwad呃,不,不会。这是t-SQL,不适用于MS AccessReg U Lar Expression谢谢你的帮助Erik!我相信,有了你提供的输入,我将能够实现所需的最终结果。