使用字符串比较筛选项目

本主题描述如何使用 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_startswithci_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_startswithci_phrasematch 以及关键字 like 匹配字符串属性中的前缀、短语和子字符串。 如果存储区已建立了索引,则使用内容索引器关键字进行搜索要比使用关键字 like 更加高效。 如果搜索方案包含子字符串匹配 (哪些内容索引器关键字不支持) ,请在 DASL 查询中使用类似 关键字 (keyword) 。

DASL 查询可以包含 ci_startswithci_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 执行要匹配短语的搜索。 它使用比较字符串中的标记(字符、字或词)对索引属性的字符串值中的整个单词进行匹配。 标记两边使用双引号或圆括号括起来。 比较字符串中的每个标记都必须有短语匹配项,而不是子字符串或前缀匹配项。 如果比较字符串包含多个标记,则比较字符串中的每个标记都必须具有短语匹配项。 具有多个单词的属性中的任何单词(如 SubjectBody )都可以进行匹配;不必是第一个单词。 例如:

  • 限制条件为"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”。

每个标记都可以匹配字符串属性中某个单词的任何部分。 如果比较字符串中包含多个标记,则比较字符串中的每个标记都必须有子字符串匹配项。 具有多个单词的属性(如 SubjectBody )中的任何单词都可以进行匹配;不必是第一个单词。

使用与等价匹配中相同的示例,假设要搜索的文件夹包含具有下列主题的项目:

  • 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。