asp+access 备注类型字段特殊字符模糊查询的问题

2025-03-19 04:48:46
推荐回答(2个)
回答1:

select * from t1 where f2 like '*请打开[[]xls-2.xls]文件*'
注意:串中的*、?、#、[、-均要用[]括在中间
access文档中有描述:
下表演示如何使用 Like 来测试不同模式的表达式。

匹配类型
模式
匹配(返回 True)
不匹配(返回 False)

多个字符 a*a aa、aBa 和 aBBBa aBC
*ab* abc、AABB 和 Xab aZb 和 bac
特殊字符 a[*]a a*a aaa
多个字符 ab* abcdefg 和 abc cab 和 aab
单个字符 a?a aaa、a3a 和 aBa aBBBa
单个数字 a#a a0a、a1a 和 a2a aaa 和 a10a
字符范围 [a-z] f、p 和 j 2 和 &
范围之外 [!a-z] 9、& 和 % b 和 a
非数字值 [!0-9] A、a、& 和 ~ 0、1 和 9
复合值 a[!b-m]# An9、az0 和 a99 abc 和 aj0

pattern 中的字符
expression 中的匹配项

? 或 _(下划线) 任意单个字符
* 或 % 零个或多个字符
# 任何单个数字 (0 - 9)
[charlist] 在 charlist 中的任何单个字符。
[!charlist] 不在 charlist 中的任何单个字符。
可以使用一组由中括号 ([]) 括起来的一个或多个字符 (charlist) 来匹配 expression 中的任何单个字符,并且 charlist 几乎可以包含 ANSI 字符集中的所有字符(包括数字)。只有当左方括号 ([)、问号 (?)、数字号 (#) 和星号 (*) 等特殊字符位于括号中时,才能使用这些字符直接与其自身进行匹配。不能在组中将右方括号与其自身匹配,但可以将其作为单个字符用于组外。
除了括在方括号中的简单字符列表外,charlist 可以通过使用连字符号 (-) 来分隔范围的上界和下界。例如,在 pattern 中使用 [A-Z] 时,如果 expression 中相应的字符包含了任何在 A 到 Z 范围之间的大写字符,就能实现匹配。可以在方括号中包含多个范围而不必为范围划界。例如,[a-zA-Z0-9] 可以匹配任何字母数字字符。
要注意的重要事项是,ANSI SQL 通配符 (%) 和 (_) 只能用于 Microsoft® Jet 4.X 版和 Microsoft OLE DB Provider for Jet。如果用于 Microsoft Access 或 DAO,则被视为文本。
用于模式匹配的其他重要规则如下所示:

charlist 开头的感叹号 (!) 表示:如果在 expression 中发现的字符不在 charlist 中,则进行匹配。感叹号用在方括号外面时,将与自身匹配。
可以将连字符 (-) 用于 charlist 的开头(如果用了感叹号,则放在感叹号之后)或末尾以便与其自身匹配。如果用于任何其他位置,则标识 ANSI 字符的范围。
指定一系列字符时,这些字符必须以升序排序次序显示(A-Z 或 0-100)。[A-Z] 是有效模式,而 [Z-A] 是无效模式。
将忽略字符顺序 [ ];该顺序被视为一个零长度字符串 ("")。

回答2:

关于你的这个问题,处理起来比较复杂,其主要原因是带了一对括号."[  ]" 这个,在Access中是通配符.

要解决你的这个问题有两种方法

第一:在数据入库前就进行字符替换.这个就目前来说,显然不是你所需要的.

第二:就是遍历数据记录,在记录循环中使用instr进行查找

例如:

tests="请打开[xls-2.xls]文件"
    Set Rs=Server.CreateObject("Adodb.Recordset")
    Sql="Select * From [ProductList]"
    Rs.Open Sql,Conn,1,1
    If Not(Rs.bof and Rs.eof) Then
        Do While Not Rs.eof 
            If Instr(Rs("product"),tests) Then
                response.Write Rs("product")
            End If
        Rs.Movenext
        Loop
    End If
    Rs.close
    Set Rs=nothing