

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

# 字符串运算符
<a name="sql-reference-string-operators"></a>

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


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

## 联接
<a name="CONCAT"></a>

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


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

## LIKE 模式
<a name="w2aac10c19c21b9"></a>

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


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

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

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


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

## SIMILAR TO 模式
<a name="SIMILARPATTERNS"></a>

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

在下面的 SIMILAR TO 表中，*seq* 表示显式指定的字符的任何序列（如 '13aq'）。用于匹配的非字母数字字符前面必须有一个在 SIMILAR TO 语句中明确声明的转义字符，例如 '13aq\\\!' SIMILAR TO '13aq\\\!24br\\\!% ESCAPE '\\'（此语句为 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 之间的字符范围<br />（使用一些已知序列，例如 1-9 或 a-z） | 5 | 
|  条形图 |   [ seq  seq] | 匹配任一 seq | 6 | 
|  星号 |   seq\* | 匹配 seq 的零个或多个重复项 | 7 | 
|  加号 |  seq\+ | 匹配 seq 的一个或多个重复项 | 8 | 
|  大括号 |   seq{<number>} | 精确匹配 seq 的重复次数  | 9 | 
|  |   seq{<low number>,<high number>} | 匹配 seq 的低重复次数或更多重复次数，最多匹配高重复次数 | 10 | 
|  问号 |   seq? | 匹配 seq 的零个或一个实例 | 11 | 
|  下划线 |  \_ |  匹配任何单个字符 | 12 | 
|  百分比 |  % |  匹配任何子字符串，包括空字符串 | 13 | 
|  字符 |  <any other character> |  只匹配完全相同的字符 | 14 | 
|   NULL |   NULL |    如果任一操作数为 NULL，则 SIMILAR TO 运算的结果为 UNKNOWN。 | 15 | 
|   非字母数字 |  特殊字符 |  要显式匹配字符串中的特殊字符，<br />该特殊字符前面必须有一个使用<br />在模式末尾指定的 ESCAPE 子句定义的转义字符。 | 16 | 

下表列出了示例。


<table>
<thead>
  <tr><th>操作</th><th>结果</th><th>规则</th></tr>
</thead>
<tbody>
  <tr><td>'a' SIMILAR TO 'a'</td><td>TRUE</td><td>14</td></tr>
  <tr><td>'a' SIMILAR TO 'A'</td><td>FALSE</td><td>14</td></tr>
  <tr><td>'a' SIMILAR TO 'b'</td><td>FALSE</td><td>14</td></tr>
  <tr><td>'ab' SIMILAR TO 'a\_'</td><td>TRUE</td><td>12</td></tr>
  <tr><td>'ab' SIMILAR TO 'a%'</td><td>TRUE</td><td>13</td></tr>
  <tr><td>'a' SIMILAR TO 'a\_'</td><td>FALSE</td><td>12 和 14</td></tr>
  <tr><td>'a' SIMILAR TO 'a%'</td><td>TRUE</td><td>13</td></tr>
  <tr><td>'abcd' SIMILAR TO 'a\_'</td><td>FALSE</td><td>12</td></tr>
  <tr><td>'abcd' SIMILAR TO 'a%'</td><td>TRUE</td><td>13</td></tr>
  <tr><td>'' SIMILAR TO ''</td><td>TRUE</td><td>14</td></tr>
  <tr><td>'1a' SIMILAR TO '\_a'</td><td>TRUE</td><td>12</td></tr>
  <tr><td>'123aXYZ' SIMILAR TO ''</td><td>TRUE</td><td>14</td></tr>
  <tr><td>'123aXYZ' SIMILAR TO '\_%\_a%\_'</td><td>TRUE</td><td>13 和 12</td></tr>
  <tr><td>'xy' SIMILAR TO '(xy)'</td><td>TRUE</td><td>1</td></tr>
  <tr><td>'abd' SIMILAR TO '[ab][bcde]d'</td><td>TRUE</td><td>2</td></tr>
  <tr><td>'bdd' SIMILAR TO '[ab][bcde]d'</td><td>TRUE</td><td>2</td></tr>
  <tr><td>'abd' SIMILAR TO '[ab]d'</td><td>FALSE</td><td>2</td></tr>
  <tr><td>'cd' SIMILAR TO '[a-e]d'</td><td>TRUE</td><td>2</td></tr>
  <tr><td>'cd' SIMILAR TO '[a-e^c]d'</td><td>FALSE</td><td>4</td></tr>
  <tr><td>'cd' SIMILAR TO '[^(a-e)]d'</td><td colspan="2">INVALID</td></tr>
  <tr><td>'yd' SIMILAR TO '[^(a-e)]d'</td><td colspan="2">INVALID</td></tr>
  <tr><td>'amy' SIMILAR TO 'amyfred'</td><td>TRUE</td><td>6</td></tr>
  <tr><td>'fred' SIMILAR TO 'amyfred'</td><td>TRUE</td><td>6</td></tr>
  <tr><td>'mike' SIMILAR TO 'amyfred'</td><td>FALSE</td><td>6</td></tr>
  <tr><td>'acd' SIMILAR TO 'ab\*c\+d'</td><td>TRUE</td><td>7 和 8</td></tr>
  <tr><td>'accccd' SIMILAR TO 'ab\*c\+d'</td><td>TRUE</td><td>7 和 8</td></tr>
  <tr><td>'abd' SIMILAR TO 'ab\*c\+d'</td><td>FALSE</td><td>7 和 8</td></tr>
  <tr><td>'aabc' SIMILAR TO 'ab\*c\+d'</td><td>FALSE</td><td> </td></tr>
  <tr><td>'abb' SIMILAR TO 'a(b{3})'</td><td>FALSE</td><td>9</td></tr>
  <tr><td>'abbb' SIMILAR TO 'a(b{3})'</td><td>TRUE</td><td>9</td></tr>
  <tr><td>'abbbbb' SIMILAR TO 'a(b{3})'</td><td>FALSE</td><td>9</td></tr>
  <tr><td>'abbbbb' SIMILAR TO 'ab{3,6}'</td><td>TRUE</td><td>10</td></tr>
  <tr><td>'abbbbbbbb' SIMILAR TO 'ab{3,6}'</td><td>FALSE</td><td>10</td></tr>
  <tr><td>'' SIMILAR TO 'ab?'</td><td>FALSE</td><td>11</td></tr>
  <tr><td>'' SIMILAR TO '(ab)?'</td><td>TRUE</td><td>11</td></tr>
  <tr><td>'a' SIMILAR TO 'ab?'</td><td>TRUE</td><td>11</td></tr>
  <tr><td>'a' SIMILAR TO '(ab)?'</td><td>FALSE</td><td>11</td></tr>
  <tr><td>'a' SIMILAR TO 'a(b?)'</td><td>TRUE</td><td>11</td></tr>
  <tr><td>'ab' SIMILAR TO 'ab?'</td><td>TRUE</td><td>11</td></tr>
  <tr><td>'ab' SIMILAR TO 'a(b?)'</td><td>TRUE</td><td>11</td></tr>
  <tr><td>'abb' SIMILAR TO 'ab?'</td><td>FALSE</td><td>11</td></tr>
  <tr><td>'ab' SIMILAR TO 'a\\\_' ESCAPE '\\'</td><td>FALSE</td><td>16</td></tr>
  <tr><td>'ab' SIMILAR TO 'a\\%' ESCAPE '\\'</td><td>FALSE</td><td>16</td></tr>
  <tr><td>'a\_' SIMILAR TO 'a\\\_' ESCAPE '\\'</td><td>TRUE</td><td>16</td></tr>
  <tr><td>'a%' SIMILAR TO 'a\\%' ESCAPE '\\'</td><td>TRUE</td><td>16</td></tr>
  <tr><td>'a(b{3})' SIMILAR TO 'a(b{3})'</td><td>FALSE</td><td>16</td></tr>
  <tr><td>'a(b{3})' SIMILAR TO 'a\\(b\\{3\\}\\)' ESCAPE '\\'</td><td>TRUE</td><td>16</td></tr>
</tbody>
</table>
