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 语言元素 » 搜索条件 » LIKE、REGEXP 和 SIMILAR TO 搜索条件

 

LIKE 搜索条件

语法

LIKE 搜索条件的语法如下:

expression [ NOT ] LIKE pattern [ ESCAPE escape-character ]
参数
  • expression   被搜索的字符串。

  • pattern   expression 内搜索的模式。

  • escape-character   用于转义下划线和百分号等特殊字符的字符。缺省的转义字符为零字符,可被指定为 "\x00" 形式的字符串文字。

注释

LIKE 搜索条件尝试将 expressionpattern 匹配,从而得出 TRUE、FALSE 或 UNKNOWN。

如果 expressionpattern 匹配(假设未指定 NOT),搜索条件的结果值为 TRUE。如果 expressionpattern 的值为 NULL,则搜索条件的结果值为 UNKNOWN。NOT 关键字会使搜索条件的含义相反,但对于 UNKNOWN,其含义保持不变。

expression 被解释为 CHAR 或 NCHAR 字符串。匹配时会使用 expression 的整个内容。同样,pattern 也被解释为 CHAR 或 NCHAR 字符串,可以包含下表中任意数目的支持的通配符:

通配符 匹配项
_(下划线) 任意一个字符。例如,a_ 与 ab 和 ac 匹配,但与 a 不匹配。
%(百分号) 包含零个或多个字符的任意字符串。例如,bl% 与 bl 和 bla 匹配。
[] 指定范围或集合中的任何单个字符。例如,T[oi]m 与 Tom 或 Tim 匹配。
[^] 在指定范围或集合中的任何单个字符。例如,M[^c] 与 Mb 和 Md 匹配,但与 Mc 不匹配。

所有其它字符都必须完全匹配。

例如,对于任何名称以字母 a 开头且倒数第二个字符为字母 b 的行,以下搜索条件都会返回 TRUE。

... name LIKE 'a%b_'

如果指定了 escape-character,其结果值必须为单字节 CHAR 或 NCHAR 字符。转义字符可以位于百分号、下划线、左方括号或 pattern 中另一转义字符之前,以防止特殊字符具有特殊的含义。以这种方式转义之后,百分号匹配百分号,下划线匹配下划线。

支持所有小于或等于 126 个字节的模式。不支持不含通配符的且大于 126 个字节的模式。支持超过 126 个字节且含通配符字符的模式,具体情况取决于模式的内容。用于表示模式的字节数取决于模式的数据类型是 CHAR 还是 NCHAR。

LIKE 搜索条件的不同使用方式
搜索对象 示例 其它信息
某字符集合中的一个字符 LIKE 'sm[iy]th' 可以通过将字符列在方括号中来指定要查找的字符集。在此示例中,搜索条件与 smithsmyth 匹配。
某字符范围中的一个字符 LIKE '[a-r]ough'

可以通过将字符范围的两端列在方括号中(用连字符分隔)来指定要查找的字符范围。在此示例中,搜索条件与 bough 和 rough 匹配,但与 tough 不匹配。

字符范围 [a-z] 被解释为 "大于等于 a 且小于等于 z",其中大于和小于运算在数据库归类中执行。有关匹配范围的信息,请参见LIKE、REGEXP 和 SIMILAR TO:字符比较上的差异

范围的下限必须位于上限之前。例如,[z-a] 与任何字符都不匹配,因为没有字符可与范围 [z-a] 匹配。

范围与集合的组合 ... LIKE '[a-rt]ough'

可以在方括号中将范围和集合组合起来。在此示例中,... LIKE '[a-rt]ough' 与 bough、rough 和 tough 匹配。

模式 [a-rt] 被解释为一个介于 a 和 r 之间(包括 a 和 r)或等于 t 的字符。

不在某范围内的一个字符 ... LIKE '[^a-r]ough'

脱字符 (^) 用于指定排除在搜索之外的字符范围。在此示例中,LIKE '[^a-r]ough' 与字符串 tough 匹配,但与字符串 rough 或 bough 不匹配。

脱字符用于对方括号内的其余内容取反。例如,方括号 [^a-rt] 被解释为不在 a 和 r 之间(包括 a 和 r)且不为 t 的字符。

搜索带尾随空白的模式 '90 ''90[ ]''90_' 当搜索模式含尾随空白时,数据库服务器只将此模式与包含空白的值匹配,而并不会为字符串填充空白。例如。模式 '90 '、'90[ ]' 和 '90_' 与表达式 '90 ' 匹配,而与表达式 '90' 不匹配,即使所测试的值位于宽为三个或三个字符以上的 CHAR 或 VARCHAR 列中也是如此。
范围和组的特殊情况

方括号中的任何单个字符都只代表该字符本身。例如,[a] 仅与字符 a 匹配。[^] 仅与脱字符匹配,[%] 仅与百分号字符匹配(在此上下文中百分号字符不作为通配符使用),[_] 仅与下划线字符匹配。同样,[[] 仅与字符 [ 匹配。

其它特殊情况如下:

  • 模式 [a-] 与字符 a 或 - 匹配。

  • 模式 [] 永远没有匹配项,始终不会返回任何行。

  • 模式 [[abp-q 会返回语法错误,因为它们缺少闭括号。

  • 方括号内不能使用通配符。模式 [a%b] 会找到 a、% 或 b 之一。

  • 除非作为方括号内的第一个字符,否则脱字符不能用于对一个范围取非。模式 [a^b] 会找到 a、^ 或 b 之一。

区分大小写以及如何执行比较

如果数据库归类区分大小写,则搜索条件也区分大小写。要通过一个区分大小写的归类执行不区分大小写的搜索,则必须包括大写和小写字符。例如,对于字符串 Bough、rough 和 TOUGH,以下搜索条件的结果值为 true:

LIKE '[a-zA-Z][oO][uU][gG][hH]'

比较是逐个字符执行的,这与等号 (=) 运算符或其它运算符的逐字符串比较不同。例如,在 UCA 归类(归类设置为 UCA 的 CHAR 或 NCHAR)中进行比较时,'?'='AE' 为 true,但 '?' LIKE 'AE' 为 false。

对于逐个字符进行的匹配比较,被搜索的表达式中的每个字符都必须与 LIKE 表达式中的一个字符(使用归类的字符等同性)或一个通配符匹配。

有关对 LIKE、SIMILAR TO 和 REGEXP 之间如何处理匹配和范围计算进行的比较,请参见LIKE、REGEXP 和 SIMILAR TO 搜索条件

国家字符 (NCHAR) 支持

LIKE 搜索条件可以用于比较 CHAR 和 NCHAR 字符串。这种情况下会执行字符集转换,以便使用共同的数据类型进行比较。然后逐个字符地执行比较。请参见CHAR 和 NCHAR 之间的比较

通过在引号引起的值之前加前缀 N(例如,expression LIKE N'pattern'),可以将 expressionpattern 指定为 NCHAR 字符串文字。还可以使用 CAST 函数将模式转换为 CHAR 或 NCHAR(例如,expression LIKE CAST(pattern AS datatype))。

请参见字符串文字CAST 函数 [Data type conversion]

空格填充的数据库

如果数据库以空格填充,LIKE 模式的语义不会更改,因为 expressionpattern 的匹配是按左到右的方式逐个字符进行比较。求值过程中不会再对 expressionpattern 执行其它空格填充。因此,表达式 a1 与模式 a1 匹配,而与模式 'a1 '(a1 后加一个空格)或 a1_ 不匹配。

另请参见
标准和兼容性
  • LIKE 搜索条件是 ANSI SQL/2003 标准的核心特性。

  • SQL Anywhere 支持 ANSI SQL/2003 特性 F281,即模式和转义字符串可以是在执行时求值的任意表达式。特性 F281 还允许 expression 是比简单列引用更为复杂的表达式。

  • 在方括号 [] 内使用字符范围和集合是一项服务商扩展功能。

  • SQL Anywhere 支持 ANSI SQL/2003 特性 T042,即允许 LIKE 搜索条件引用值类型为 LONG VARCHAR 的字符串表达式。

  • 指定 NCHAR 字符串表达式或模式的 LIKE 搜索条件是 ANSI SQL/2003 标准的特性 F421。