使用字符串比较筛选项目
本主题描述如何使用 Microsoft Jet 语法和 DAV 搜索和定位 (DASL) 语法支持依据字符串属性进行筛选。
分隔字符串和使用转义符
在匹配字符串属性时,可以使用一对单引号 (') 或一对双引号 (") 来分隔构成筛选器的字符串。 例如,当属性类型为 String 时,下面的所有命令均能正确运行:
sFilter = "[CompanyName] = 'Microsoft'"
sFilter = "[CompanyName] = " & Chr(34) & "Microsoft" & Chr(34)
在 Jet 或 DASL 查询中指定筛选器的过程中,如果使用一对单引号来分隔构成筛选器的字符串,而且该字符串包含另一个单引号或撇号,则应在这个单引号或撇号前面添加一个单引号以用作转义符。 如果使用一对双引号来分隔字符串,则也可使用类似方法。 如果该字符串包含一个双引号,则应在该双引号前面添加一个双引号以用作转义符。
例如,在筛选 Subject 属性等于单词 can't
的 DASL 筛选器字符串中,整个筛选器字符串由一对双引号分隔,嵌入的字符串 can't
由一对单引号分隔。 此筛选器字符串中需要转义三个字符:的起始双引号和结束双引号用于 的属性引用 https://schemas.microsoft.com/mapi/proptag/0x0037001f
,以及单词 can't
的值条件中的撇号。
通过应用适当的转义符,您可将筛选器字符串表示如下:
filter = "@SQL=""https://schemas.microsoft.com/mapi/proptag/0x0037001f"" = 'can''t'"
或者,可以使用 chr(34)
函数来表示双引号 (其 ASCII 字符值为 34) 用作转义字符。 通过使用 chr(34)
代替双引号转义符,您可将上一个示例表示如下:
filter = "@SQL= " & Chr(34) & "https://schemas.microsoft.com/mapi/proptag/0x0037001f" _
& Chr(34) & " = " & "'can''t'"
对于使用 ci_startswith 或 ci_phrasematch 运算符的 DASL 查询而言,转义单引号和双引号字符也是必需的。 例如,以下查询可在邮件主题中执行针对 can't
的短语匹配查询:
filter = "@SQL=" & Chr(34) & "https://schemas.microsoft.com/mapi/proptag/0x0037001E" _
& Chr(34) & " ci_phrasematch " & "'can''t'"
另一个示例是一个 DASL 筛选器字符串,该字符串筛选 Subject 属性是否等于单词 the right stuff
,其中单词 stuff
用双引号括起来。 在此情况下,必须通过以下方式对括起的双引号进行转义:
filter = "@SQL=""https://schemas.microsoft.com/mapi/proptag/0x0037001f"" = 'the right ""stuff""'"
对于包含空格、单引号或双引号字符的命名属性的属性引用,则应用一组不同的转义规则。 如果属性引用包含空格、单引号或双引号字符,则必须在属性引用中使用统一资源定位器 (URL) 转义,如下所示:
属性引用中的字符 | 转义符 |
---|---|
空格字符 | %20 |
双引号 | %22 |
单引号 | %27 |
例如,可以使用以下筛选器搜索名为 “Mom's”Gift“的 自定义属性,该属性包含单词 pearls
:
filter = "@SQL=" & Chr(34) & _
"https://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/" _
& "Mom%27s%20%22Gift%22" & Chr(34) & " like '%pearls%'"
使用 Jet 语法的字符串比较
Jet 筛选器支持的字符串比较仅限于等价匹配。 可以基于与特定字符串等价的字符串属性的值来筛选项目,例如, LastName 属性等于"Wilson"。 请注意,比较不区分大小写;在上一示例中,指定"Wilson"和"wilson"作为比较字符串将返回相同的结果。
使用 DASL 语法的字符串比较
DASL 筛选器支持的字符串比较包括等价、前缀、短语和子字符串匹配。 请注意,在对 Subject 属性进行筛选时,将忽略诸如"RE:"和"FW:"的前缀。 例如...
sFilter = "[Subject] = 'cat'"
...将同时匹配“cat”和“RE: cat”。
等价匹配
与 Jet 筛选器类似,DASL 筛选器使用等号 (=) 运算符执行字符串等价比较。 除了前面提到的前缀"RE:"和"FW:"之外,字符串属性的值必须等价于比较字符串。
例如,下面的 DASL 查询可创建公司名称等于"Microsoft"的筛选器:
criteria = "@SQL=" & Chr(34) _
& "urn:schemas-microsoft-com:office:office#Company" & Chr(34) _
& " = 'Microsoft'"
又如,假设要搜索的文件夹包含具有下列主题的项目:
- Question
- Questionable
- Unquestionable
- RE: Question
- The big question
以下 = 限制...
criteria = "@SQL=" & Chr(34) _
& "urn:schemas:httpmail:subject" & Chr(34) _
& " = 'question'"
...将返回以下结果:
- 问题
- RE: Question
前缀、短语和子字符串匹配
DASL 支持使用内容索引器关键字 ci_startswith 和 ci_phrasematch 以及关键字 like 匹配字符串属性中的前缀、短语和子字符串。 如果存储区已建立了索引,则使用内容索引器关键字进行搜索要比使用关键字 like 更加高效。 如果搜索方案包含子字符串匹配 (哪些内容索引器关键字不支持) ,请在 DASL 查询中使用类似 关键字 (keyword) 。
DASL 查询可以包含 ci_startswith 或 ci_phrasematch 以及 like ,但是所有字符串比较都将作为子字符串匹配执行。
ci_startswith
ci_startswith的语法如下所示...
<PropertySchemaName> ci_startswith <ComparisonString>
...其中 PropertySchemaName 是命名空间引用的属性的有效名称, ComparisonString 是用于比较的字符串。
ci_startswith 执行要匹配前缀的搜索。 它使用比较字符串中的标记(字符、字或词)来对索引属性字符串值中任意词的前几个字符进行匹配。 如果比较字符串包含多个标记,则比较字符串中的每个标记都必须在索引属性中具有前缀匹配项。 例如:
- 限制条件为"sea"会与"search"匹配
- 限制条件为"sea"不会匹配"research"
- 限制条件为"sea"会与"Subject: the deep blue sea"匹配
- 限制条件为“law order”会与“law and order”或“law & order”匹配
- 限制条件为"law and order"会与"I like the show Law and Order."匹配
- 限制条件为"law and order"不会匹配"above the law"
- 限制条件为"sea creatures"会与"Nova special on sea creatures"匹配
- 限制条件为"sea creatures"会与"sealife creatures"匹配
- 限制条件为"sea creatures"不会匹配"undersea creatures"
使用与等价匹配中相同的示例,假设要搜索的文件夹包含具有下列主题的项目:
- Question
- Questionable
- Unquestionable
- RE: Question
- The big question
以下 ci_startswith 限制...
criteria = "@SQL=" & Chr(34) _
& "urn:schemas:httpmail:subject" & Chr(34) _
& " ci_startswith 'question'"
...将返回以下结果:
- 问题
- Questionable
- RE: Question
- The big question
ci_phrasematch
ci_phrasematch的语法如下所示...
<PropertySchemaName> ci_phrasematch <ComparisonString>
...其中 PropertySchemaName 是命名空间引用的属性的有效名称, ComparisonString 是用于比较的字符串。
ci_phrasematch 执行要匹配短语的搜索。 它使用比较字符串中的标记(字符、字或词)对索引属性的字符串值中的整个单词进行匹配。 标记两边使用双引号或圆括号括起来。 比较字符串中的每个标记都必须有短语匹配项,而不是子字符串或前缀匹配项。 如果比较字符串包含多个标记,则比较字符串中的每个标记都必须具有短语匹配项。 具有多个单词的属性中的任何单词(如 Subject 或 Body )都可以进行匹配;不必是第一个单词。 例如:
- 限制条件为"cat"会与"cat"、"cat box"和"black cat"匹配
- 限制条件为"cat"会与"re: cat is out"匹配
- 限制条件为"cat"不会匹配"catalog"和"kittycat"
- 限制条件为"kitty cat"会与"put the kitty cat out"匹配
- 限制条件为"kitty cat"不会匹配"great kitty catalog"
使用与等价匹配中相同的示例,假设要搜索的文件夹包含具有下列主题的项目:
- Question
- Questionable
- Unquestionable
- RE: Question
- The big question
以下 ci_phrasematch 限制...
criteria = "@SQL=" & Chr(34) _
& "urn:schemas:httpmail:subject" & Chr(34) _
& " ci_phrasematch 'question'"
...将返回以下结果:
- 问题
- RE: Question
- The big question
喜欢
like 可执行前缀、子字符串或等价匹配。 根据不同匹配类型,会以特定方式在标记(字符、字或词)的两边添加 % 字符:
前缀匹配
like '<token>%'
例如,限制为...
like 'cat%'
...将匹配“cat”和“catalog”。
子字符串匹配
like '%<token>%'
例如,限制为...
like '%cat%'
...将匹配“cat”、“catalog”、“kittycat”、“decathlon”。
等效匹配
like '<token>'
例如,限制为...
like 'cat'
...将匹配“cat”和“RE:Cat”。
每个标记都可以匹配字符串属性中某个单词的任何部分。 如果比较字符串中包含多个标记,则比较字符串中的每个标记都必须有子字符串匹配项。 具有多个单词的属性(如 Subject 或 Body )中的任何单词都可以进行匹配;不必是第一个单词。
使用与等价匹配中相同的示例,假设要搜索的文件夹包含具有下列主题的项目:
- Question
- Questionable
- Unquestionable
- RE: Question
- The big question
以下类似限制...
criteria = "@SQL=" & Chr(34) _
& "urn:schemas:httpmail:subject" & Chr(34) _
& " like '%question%'"
...将返回以下结果:
- 问题
- Questionable
- Unquestionable
- RE: Question
- The big question
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。