

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 字符串运算符


您可以使用流式 SQL 的字符串运算符（包括联接和字符串模式比较）来合并和比较字符串。


| 运算符 | 一元/二进制 | 说明 | 注意 | 
| --- | --- | --- | --- | 
|  \$1\$1  |  B  |  联接  |  也适用于二进制类型  | 
|  LIKE  |  B  |  字符串模式比较  |  <string> LIKE <like pattern> [ESCAPE <escape character>]  | 
|  SIMILAR TO  |  B  |  字符串模式比较  |  <string> SIMILAR TO <similar to pattern> [ESCAPE <escape character>]  | 

## 联接


此运算符用于联接一个或多个字符串，如下表所示。


| 操作 | 结果 | 
| --- | --- | 
|  'SQL'\$1\$1'stream'  |  SQLstream  | 
|  'SQL'\$1\$1''\$1\$1'stream'  |  SQLstream  | 
|  'SQL'\$1\$1'stream'\$1\$1' Incorporated'  |  SQLstream 注册成立  | 
|  <col1>\$1\$1<col2>\$1\$1<col3>\$1\$1<col4>  |  <col1><col2><col3><col4>  | 

## LIKE 模式


LIKE 将字符串与字符串模式进行比较。在模式中，字符“\$1”（下划线）和“%”（百分比）具有特殊含义。


| 模式中的字符 | 效果 | 
| --- | --- | 
|  \$1  |  匹配任何单个字符。  | 
|  %  |  匹配任何子字符串，包括空字符串  | 
|  <any other character>  |  只匹配完全相同的字符  | 

如果任一运算对象为 NULL，则 LIKE 运算的结果为 UNKNOWN。

要显式匹配字符串中的特殊字符，必须使用 ESCAPE 子句指定转义字符。然后，转义字符必须位于模式中的特殊字符之前。下表列出了示例。


| 操作 | 结果 | 
| --- | --- | 
|  'a' LIKE 'a'  |  TRUE  | 
|  'a' LIKE 'A'  |  FALSE  | 
|  'a' LIKE 'b'  |  FALSE  | 
|  'ab' LIKE 'a\$1'  |  TRUE  | 
|  'ab' LIKE 'a%'  |  TRUE  | 
|  'ab' LIKE 'a\$1\$1' ESCAPE '\$1'  |  FALSE  | 
|  'ab' LIKE 'a\$1%' ESCAPE '\$1'  |  FALSE  | 
|  'a\$1' LIKE 'a\$1\$1' ESCAPE '\$1'  |  TRUE  | 
|  'a%' LIKE 'a\$1%' ESCAPE '\$1'  |  TRUE  | 
|  'a' LIKE 'a\$1'  |  FALSE  | 
|  'a' LIKE 'a%'  |  TRUE  | 
|  'abcd' LIKE 'a\$1'  |  FALSE  | 
|  'abcd' LIKE 'a%'  |  TRUE  | 
|  '' LIKE ''  |  TRUE  | 
|  '1a' LIKE '\$1a'  |  TRUE  | 
|  '123aXYZ' LIKE '%a%'  |  TRUE  | 
|  '123aXYZ' LIKE '\$1%\$1a%\$1'  |  TRUE  | 

## SIMILAR TO 模式


SIMILAR TO 将字符串与模式进行比较。很像 LIKE 运算符，但功能更强大，因为模式是正则表达式。

在下面的 SIMILAR TO 表中，*seq* 表示显式指定的字符的任何序列（如 '13aq'）。用于匹配的非字母数字字符前面必须有一个在 SIMILAR TO 语句中明确声明的转义字符，例如 '13aq\$1\$1' SIMILAR TO '13aq\$1\$124br\$1\$1% ESCAPE '\$1'（此语句为 TRUE）。

当指定范围时，例如在模式中使用短划线时，将使用当前的排序序列。典型范围为 0-9 和 a-z。[PostgreSQL](https://www.postgresql.org/docs/7.3/static/functions-matching.html) 提供了模式匹配的典型讨论（包括范围）。

当一行需要多次比较时，将首先匹配可以匹配的最里面的模式，然后匹配“下一个最里面的模式”，依此类推。

在应用周围运算之前计算括在圆括号内的表达式和匹配运算，同样优先计算最里面的项目。


| 分隔符 | 模式中的字符 | 效果 | 规则 ID | 
| --- | --- | --- | --- | 
|  圆括号 (  )  |    (  seq  )  |   为 *seq* 分组（用于定义模式表达式的优先级）  |  1  | 
|   方括号 [  ]  |   [  seq  ]  |  匹配 seq 中的任何单个字符  |  2  | 
|   脱字符或音调符号  |   [^seq]  |   匹配不在 seq 中的任何单个字符  |  3  | 
|   |    [ seq ^ seq]  |  匹配 seq 中和不在 seq 中的任何单个字符  |  4  | 
|  短划线  |   <character1>-<character2>  |  指定字符 1 和字符 2 之间的字符范围 （使用一些已知序列，例如 1-9 或 a-z）  |  5  | 
|   条形图  |    [ seq  seq]  |  匹配任一 seq  |  6  | 
|   星号  |    seq\$1  |  匹配 seq 的零个或多个重复项  |  7  | 
|   加号  |   seq\$1  |  匹配 seq 的一个或多个重复项  |  8  | 
|   大括号  |    seq\$1<number>\$1  |  精确匹配 seq 的重复次数   |  9  | 
|    |    seq\$1<low number>,<high number>\$1  |  匹配 seq 的低重复次数或更多重复次数，最多匹配高重复次数  |  10  | 
|   问号  |    seq?  |  匹配 seq 的零个或一个实例  |  11  | 
|   下划线  |   \$1  |   匹配任何单个字符  |  12  | 
|   百分比  |   %  |   匹配任何子字符串，包括空字符串  |  13  | 
|   字符  |   <any other character>  |   只匹配完全相同的字符  |  14  | 
|    NULL  |    NULL  |     如果任一操作数为 NULL，则 SIMILAR TO 运算的结果为 UNKNOWN。  |  15  | 
|    非字母数字  |   特殊字符  |   要显式匹配字符串中的特殊字符， 该特殊字符前面必须有一个使用 在模式末尾指定的 ESCAPE 子句定义的转义字符。  |  16  | 

下表列出了示例。


| 操作 | 结果 | 规则 | 
| --- | --- | --- | 
|  'a' SIMILAR TO 'a'  |  TRUE  |  14  | 
|  'a' SIMILAR TO 'A'  |  FALSE  |  14  | 
|  'a' SIMILAR TO 'b'  |  FALSE  |  14  | 
|  'ab' SIMILAR TO 'a\$1'  |  TRUE  |  12  | 
|  'ab' SIMILAR TO 'a%'  |  TRUE  |  13  | 
|  'a' SIMILAR TO 'a\$1'  |  FALSE  |  12 和 14  | 
|  'a' SIMILAR TO 'a%'  |  TRUE  |  13  | 
|  'abcd' SIMILAR TO 'a\$1'  |  FALSE  |  12  | 
|  'abcd' SIMILAR TO 'a%'  |  TRUE  |  13  | 
|  '' SIMILAR TO ''  |  TRUE  |  14  | 
|  '1a' SIMILAR TO '\$1a'  |  TRUE  |  12  | 
|  '123aXYZ' SIMILAR TO ''  |  TRUE  |  14  | 
|  '123aXYZ' SIMILAR TO '\$1%\$1a%\$1'  |  TRUE  |  13 和 12  | 
|  'xy' SIMILAR TO '(xy)'  |  TRUE  |  1  | 
|  'abd' SIMILAR TO '[ab][bcde]d'  |  TRUE  |  2  | 
|  'bdd' SIMILAR TO '[ab][bcde]d'  |  TRUE  |  2  | 
|  'abd' SIMILAR TO '[ab]d'  |  FALSE  |  2  | 
|  'cd' SIMILAR TO '[a-e]d'  |  TRUE  |  2  | 
|  'cd' SIMILAR TO '[a-e^c]d'  |  FALSE  |  4  | 
|  'cd' SIMILAR TO '[^(a-e)]d'  |  INVALID  | 
|  'yd' SIMILAR TO '[^(a-e)]d'  |  INVALID  | 
|  'amy' SIMILAR TO 'amyfred'  |  TRUE  |  6  | 
|  'fred' SIMILAR TO 'amyfred'  |  TRUE  |  6  | 
|  'mike' SIMILAR TO 'amyfred'  |  FALSE  |  6  | 
|  'acd' SIMILAR TO 'ab\$1c\$1d'  |  TRUE  |  7 和 8  | 
|  'accccd' SIMILAR TO 'ab\$1c\$1d'  |  TRUE  |  7 和 8  | 
|  'abd' SIMILAR TO 'ab\$1c\$1d'  |  FALSE  |  7 和 8  | 
|  'aabc' SIMILAR TO 'ab\$1c\$1d'  |  FALSE  |   | 
|  'abb' SIMILAR TO 'a(b\$13\$1)'  |  FALSE  |  9  | 
|  'abbb' SIMILAR TO 'a(b\$13\$1)'  |  TRUE  |  9  | 
|  'abbbbb' SIMILAR TO 'a(b\$13\$1)'  |  FALSE  |  9  | 
|  'abbbbb' SIMILAR TO 'ab\$13,6\$1'  |  TRUE  |  10  | 
|  'abbbbbbbb' SIMILAR TO 'ab\$13,6\$1'  |  FALSE  |  10  | 
|  '' SIMILAR TO 'ab?'  |  FALSE  |  11  | 
|  '' SIMILAR TO '(ab)?'  |  TRUE  |  11  | 
|  'a' SIMILAR TO 'ab?'  |  TRUE  |  11  | 
|  'a' SIMILAR TO '(ab)?'  |  FALSE  |  11  | 
|  'a' SIMILAR TO 'a(b?)'  |  TRUE  |  11  | 
|  'ab' SIMILAR TO 'ab?'  |  TRUE  |  11  | 
|  'ab' SIMILAR TO 'a(b?)'  |  TRUE  |  11  | 
|  'abb' SIMILAR TO 'ab?'  |  FALSE  |  11  | 
|  'ab' SIMILAR TO 'a\$1\$1' ESCAPE '\$1'  |  FALSE  |  16  | 
|  'ab' SIMILAR TO 'a\$1%' ESCAPE '\$1'  |  FALSE  |  16  | 
|  'a\$1' SIMILAR TO 'a\$1\$1' ESCAPE '\$1'  |  TRUE  |  16  | 
|  'a%' SIMILAR TO 'a\$1%' ESCAPE '\$1'  |  TRUE  |  16  | 
|  'a(b\$13\$1)' SIMILAR TO 'a(b\$13\$1)'  |  FALSE  |  16  | 
|  'a(b\$13\$1)' SIMILAR TO 'a\$1(b\$1\$13\$1\$1\$1)' ESCAPE '\$1'  |  TRUE  |  16  | 