Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语言元素 » 搜索条件

 

CONTAINS 搜索条件

语法
CONTAINS ( column-name [,...], contains-query-string )
contains-query-string :
simple-expression
| or-expression
simple-expression :
primary-expression
| and-expression
or-expression :
simple-expression { OR | | } contains-query-string
primary-expression :
basic-expression
| FUZZY " fuzzy-expression "
| and-not-expression
and-expression :
primary-expression [ AND | & ] simple-expression
and-not-expression :
primary-expression [ AND | & ] { NOT | - } basic-expression
basic-expression :
term
| phrase
| ( contains-query-string )
| near-expression
fuzzy-expression :
term
| fuzzy-expression term
term :
simple-term
| prefix-term
prefix-term : 
simple-term*
phrase :
" phrase-string "
near-expression :
term NEAR[distance] term
| term { NEAR | ~ } term
phrase-string :
term
| phrase-string term
simple-term : A string separated by whitespace and special characters that
represents a single indexed term (word) to search for.
distance : a positive integer
参数
  • and-expression   使用 and-expression 来指定 primary-expressionsimple-expression 都必须出现在文本索引中。

    缺省情况下,如果在术语或表达式之间未指定任何运算符,则假定为 and-expression。例如,'a b' 被解释为 'a AND b'

    和号 (&) 可用来代替 AND,并且可以紧靠表达式或术语的任何一侧(例如,'a &b')。

    请参见对于特殊字符允许的语法

  • and-not-expression   使用 and-not-expression 来指定 primary-expression 必须存在于文本索引中,但 basic-expression 一定不能 出现在文本索引中。这也称为取非

    如果使用连字符表示取非,则在连字符左侧必须留有一个空格,且连字符右侧必须与术语邻接;否则不将连字符解释为取非。例如,'a -b' 等同于 'a AND NOT b';而对于 'a - b',连字符被忽略,该字符串等同于 'a AND b''a-b' 等同于短语 '"a b"'。请参见对于连字符 (-) 允许的语法

  • or-expression   使用 or-expression 来指定 simple-expressioncontains-query-string 至少得有一个存在于文本索引中。例如,'a|b' 被解释为 'a OR b'。请参见对于特殊字符允许的语法

  • fuzzy-expression   使用 fuzzy-expression 来查找与您指定的术语相类似的术语。只有 NGRAM 文本索引上支持模糊匹配。请参见模糊搜索

  • near-expression   使用 near-expression 来搜索彼此邻近的术语。这也称为邻近搜索。例如,'b NEAR[5] c' 搜索相互间隔五个或五个以下术语的 b 和 c 实例。术语的顺序并不重要;'b NEAR c' 等同于 'c NEAR b'

    如果指定 NEAR 时未指定 distance,则应用缺省值 10 个术语。

    可指定代字号 (~) 来代替 NEAR。这相当于指定 NEAR 时未指定距离,所以应用了缺省值 10 个术语。

    NEAR 表达式不可以链接在一起(例如,'a NEAR[1] b NEAR[1] c')。

    请参见对于特殊字符允许的语法邻近搜索

  • prefix-term   使用 prefix-term 来搜索以特定前缀开始的术语。例如,'datab*' 用于搜索以 datab 开始的任何术语。这也称为前缀搜索。在前缀搜索中,执行匹配的是星号左侧的术语部分。请参见对于星号 (*) 允许的语法前缀搜索

注释

CONTAINS 搜索条件将一个列列表和 contains-query-string 作为参数。它可以用在任何能够指定搜索条件(也称作谓语)的地方,并返回 TRUE 或 FALSE。contains-query-string 必须是含有在查询时就已知的值的常量字符串或变量。

如果指定了多个列,则它们全都必须引用单个基表;一个文本索引不能跨多个基表。基表可以在 FROM 子句中直接引用,也可以用在视图或派生表中,前提是该视图或派生表不使用 DISTINCT、GROUP BY、ORDER BY、UNION、INTERSECT、EXCEPT 或行限制。

以下警告适用于在查询字符串中使用非字母数字字符的情况:

  • 在术语中间使用星号会返回错误。

  • 不要在 fuzzy-expression 中使用非字母数字(包括特殊字符),因为它们会被看作是空白并用作术语中断符。

  • 如果可能,不要在查询字符串中包含不是特殊字符的非字母数字字符。任何不是特殊字符的非字母数字字符都会使包含该字符的术语被视为一个短语,从而在字符所在的位置断开术语。例如,'things we've done' 被解释为 'things "we ve" done'

在短语内,星号是唯一被继续解释为特殊字符的特殊字符。短语中所有其它特殊字符都被视作空白并用作术语中断符。

contains-query-string 进行解释主要包括两步:

  • 第 1 步:解释运算符和优先级   在执行此步骤期间,将关键字解释为运算符,并应用优先级规则。请参见CONTAINS 搜索条件中的运算符优先级

  • 第 2 步:应用文本配置对象设置   在执行此步骤期间,将文本配置对象设置应用于术语。例如,在 NGRAM 文本索引中,术语被分解为 n 元语法词表示。在执行此步骤期间,将删除超过术语长度设置或在非索引字表中的查询术语。有关删除术语时如何解释查询字符串的详细信息,请参见文本配置对象示例

CONTAINS 搜索条件中的运算符优先级

在进行查询计算期间,使用以下优先级顺序计算表达式:

  1. FUZZY、NEAR

  2. AND NOT

  3. AND

  4. OR

对于星号 (*) 允许的语法

星号被用于前缀搜索。星号可以出现在查询字符串的结尾处,或在其后紧跟空格、和号、竖线、右括号或右引号。其它所有的星号用法都会返回错误。

下表显示了允许的星号用法:

查询字符串 等同于: 解释为:

'th*'

查找所有以 th 开头的术语。

'th*&best'

'th* AND best''th* best'

查找所有以 th 开头的术语,并查找术语 best。

'th*|best'

'th* OR best'

查找所有以 th 开头的术语,或查找术语 best

'very&(best|th*)'

'very AND (best OR th*)'

查找术语 very,并查找术语 best 或任何以 th 开头的术语。

'"fast auto*"'

查找术语 fast,随后紧跟以 auto 开头的术语。

'"auto* price"'

查找以 auto 开头的术语,随后紧跟术语 price。

注意

对包含星号的查询字符串的解释视文本配置对象设置而异。请参见前缀搜索

对于连字符 (-) 允许的语法

连字符可用于对术语或表达式取非,等同于 NOT。是否将连字符解释为取非要取决于连字符在查询字符串中的位置。例如,如果连字符紧靠在术语或表达式之前,则将连字符解释为取非。如果将连字符嵌入术语内,则将连字符解释为连字符。

用于取非的连字符的前面必须有一个空白,而后面紧跟表达式。

当用在模糊表达式的短语中时,连字符被视为空白并用作术语分隔符。

下表显示了对于连字符允许的语法:

查询字符串 等同于: 解释为:

'the -best'

'the AND NOT best', 'the AND -best', 'the & -best', 'the NOT best'

查找术语 the,但不查找术语 best。

'the -(very best)'

'the AND NOT (very AND best)'

查找术语 the,但不查找术语 very 和 best。

'the -"very best"'

'the AND NOT "very best"'

查找术语 the,但不查找短语 very best。

'alpha-numerics'

'"alpha numerics"'

查找术语 alpha,随后紧跟术语 numerics。

'wild - west'

'wild west''wild AND west'

查找术语 wild,并查找术语 west。

对于特殊字符允许的语法

下表显示了对于除星号和连字号之外(这两个特殊字符在前面两节中已进行介绍)的其它所有特殊字符所允许的语法:对于星号 (*) 允许的语法对于连字符 (-) 允许的语法

如果在短语中找到了这些字符,则不认为它们是特殊字符,并将它们删除。

注意

指定字符串文字时的限制同样适用于查询字符串。例如,必须对撇号进行转义等。有关格式化字符串文字的详细信息,请参见字符串文字

字符或语法 用法示例和注释
和号 (&)

和号等同于 AND,可指定为以下形式:

  • 'a & b'
  • 'a &b'
  • 'a&b'
  • 'a& b'
竖线 (|)

竖线等同于 OR,可指定为以下形式:

  • 'a|b'
  • 'a |b'
  • 'a | b'
  • 'a| b'
双引号 (")

双引号用于包含那些顺序和相对距离都很重要的一连串术语。例如,在查询字符串 'learn "full text search"' 中,"full text search" 是一个短语。在此示例中,learn 可以放置在短语的前面或后面,或者位于另一个列中(如果文本索引基于不止一个列构建的),但必须在单个列中找到完全一样的短语。

括号 ()

如果表达式的计算顺序与缺省顺序不同,则使用括号指定表达式的计算顺序。例如,'a AND (b|c)' 被解释为 a 和 b 或 c。

有关缺省计算顺序的详细信息,请参见CONTAINS 搜索条件中的运算符优先级

代字号 (~)

代字号等同于 NEAR,没有特殊的语法规则。查询字符串 'full~text' 等同于 'full NEAR text',可解释为:术语 full 和术语 text 的距离在十个术语范围之内。

方括号 [ ]

方括号与关键字 NEAR 结合使用以包含 distance。方括号的其它用法会返回错误。

另请参见