

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

# 字符串和搜索函数
<a name="sql-reference-string-and-search-functions"></a>

本节中的主题介绍了 Amazon Kinesis Data Analytics 流式 SQL 的字符串和搜索函数。

**Topics**
+ [CHAR\$1LENGTH/CHARACTER\$1LENGTH](sql-reference-char-length.md)
+ [INITCAP](sql-reference-initcap.md)
+ [LOWER](sql-reference-lower.md)
+ [OVERLAY](sql-reference-overlay.md)
+ [POSITION](sql-reference-position.md)
+ [REGEX\$1REPLACE](sql-reference-regex-replace.md)
+ [SUBSTRING](sql-reference-substring.md)
+ [TRIM](sql-reference-trim.md)
+ [UPPER](sql-reference-upper.md)

# CHAR\$1LENGTH/CHARACTER\$1LENGTH
<a name="sql-reference-char-length"></a>

```
 CHAR_LENGTH | CHARACTER_LENGTH ( <character-expression> )
```

返回作为输入参数传递的字符串的字符长度。如果输入参数为 null，则返回 null。

## 示例
<a name="sql-reference-char-length-examples"></a>


|  |  | 
| --- |--- |
|  <pre>CHAR_LENGTH('one')</pre>  |  3  | 
|  <pre>CHAR_LENGTH('')</pre>  |  0  | 
|  <pre>CHARACTER_LENGTH('fred')</pre>  |  4  | 
|  <pre>CHARACTER_LENGTH( cast (null as varchar(16) )</pre>  |  null  | 
|  <pre>CHARACTER_LENGTH( cast ('fred' as char(16) )</pre>  |  16  | 

## 限制
<a name="sql-reference-char-length-limitations"></a>

Amazon Kinesis Data Analytics 流式 SQL 不支持可选的 USING CHARACTERS \$1 OCTETS 子句。这偏离了 SQL:2008 标准。

# INITCAP
<a name="sql-reference-initcap"></a>

```
INITCAP ( <character-expression> )
```

返回转换后的输入字符串版本，以便每个以空格分隔的单词的第一个字符都是大写的，所有其他字符都是小写的。

## 示例
<a name="sql-reference-initcap-examples"></a>


| 函数 | 结果 | 
| --- | --- | 
|  INITCAP（'每个 FIRST lEtTe R 都是大写的'）  |  每个首字母均为大写  | 

## 
<a name="sqlrf-initcap-notes"></a>

**注意**  
INITCAP 函数不是 SQL:2008 标准的一部分。它是 Amazon Kinesis Data Analytics 扩展。

# LOWER
<a name="sql-reference-lower"></a>

```
LOWER ( <character-expression> )
```

将字符串转换为全小写字符。如果输入参数为 null，则返回 null；如果输入参数为空字符串，则返回空字符串。

## 示例
<a name="sql-reference-lower-examples"></a>


| 函数 | 结果 | 
| --- | --- | 
|  更低 ('abc DEFghi123 ')  |  abcdefghi123  | 

# OVERLAY
<a name="sql-reference-overlay"></a>

```
 OVERLAY ( <original-string>
           PLACING <replacement-string>
           FROM <start-position>
           [ FOR <string-length> ]
         )
 <original-string> := <character-expression>
 <replacement-string> := <character-expression>
 <start-position> := <integer-expression>
 <string-length> := <integer-expression>
```

OVERLAY 函数用于将第一个字符串参数的一部分（原始字符串）替换为第二个字符串参数（替换字符串）。

起始位置表示原始字符串中应覆盖替换字符串的字符位置。可选的字符串长度参数确定要替换原始字符串的字符数（如果未指定，则默认为替换字符串的长度）。如果替换字符串中的字符多于原始字符串中剩余的字符，则只需附加剩余的字符即可。

如果起始位置大于原始字符串的长度，则只需附加替换字符串即可。如果起始位置小于 1，则替换字符串的（1 - 起始位置）字符将添加到结果之前，其余字符叠加在原始字符串上（请参阅下面的示例）。

如果字符串长度小于零，则会引发异常。

如果任何输入参数为 null，则结果为 null。

## 示例
<a name="sqlrf-overlay-examples"></a>


| 函数 | 结果 | 
| --- | --- | 
|  OVERLAY ('12345' PLACING 'foo' FROM 1)  |  foo45  | 
|  OVERLAY ('12345' PLACING 'foo' FROM 0)  |  foo345  | 
|  OVERLAY ('12345' PLACING 'foo' FROM -2)  |  foo12345  | 
|  OVERLAY ('12345' PLACING 'foo' FROM 4)  |  123foo  | 
|  OVERLAY ('12345' PLACING 'foo' FROM 17)  |  12345foo  | 
|  OVERLAY ('12345' PLACING 'foo' FROM 2 FOR 0)  |  1foo2345  | 
|  OVERLAY ('12345' PLACING 'foo' FROM 2 FOR 2)  |  1foo45  | 
|  OVERLAY ('12345' PLACING 'foo' FROM 2 FOR 9)  |  1foo  | 

## 限制
<a name="sqlrf-overlay-limitations"></a>

Amazon Kinesis Data Analytics 不支持 SQL:2008 中定义的可选 USING CHARACTERS \$1 OCTETS 子句；仅假设使用 USING CHARACTERS。严格的 SQL:2008 还要求小于 1 的起始位置返回 null 结果，而不是上述行为。这些都偏离了标准。

# POSITION
<a name="sql-reference-position"></a>

```
 POSITION ( <search-string> IN <source-string> )
 search-string := <character-expression>
 source-string := <character-expression>
```

POSITION 函数在第二个输入参数（源字符串）中搜索第一个输入参数（搜索字符串）。

如果在源字符串中找到搜索字符串，POSITION 将返回搜索字符串的第一个实例的字符位置（忽略后续实例）。如果搜索字符串为空字符串，则 POSITION 返回 1。

如果未找到搜索字符串，则 POSITION 返回 0。

如果搜索字符串或源字符串为 null，则 POSITION 返回 null。

## 示例
<a name="sql-reference-position-examples"></a>


| 函数 | 结果 | 
| --- | --- | 
|  POSITION ('findme' IN '1234findmeXXX')  |  5  | 
|  POSITION ('findme' IN '1234not-hereXXX')  |  0  | 
|  POSITION ('1' IN '1234567')  |  1  | 
|  POSITION ('7' IN '1234567')  |  7  | 
|  POSITION ('' IN '1234567')  |  1  | 

## 限制
<a name="sql-reference-position-limitations"></a>

Amazon Kinesis Data Analytics 流式 SQL 不支持 SQL:2008 中定义的可选 USING CHARACTERS \$1 OCTETS 子句；仅假设使用 USING CHARACTERS。这偏离了该标准。

# REGEX\$1REPLACE
<a name="sql-reference-regex-replace"></a>

REGEX\$1REPLACE 将子字符串替换为备用子字符串。它返回以下 Java 表达式的值。

```
java.lang.String.replaceAll(regex, replacement)
```

## 语法
<a name="sql-reference-regex-replace-syntax"></a>

```
REGEX_REPLACE(original VARCHAR(65535), regex VARCHAR(65535), replacement VARCHAR(65535), startPosition int, occurence int)

RETURNS VARCHAR(65535)
```

## 参数
<a name="sql-reference-regex-replace-parameters"></a>

*original*

要对其执行正则表达式操作的字符串。

*regex*

要匹配的[正则表达式](https://en.wikipedia.org/wiki/Regular_expression)。如果 *regex* 的编码与 *original* 的编码不匹配，则将向错误流写入错误。

*replacement*

用于替换 *original* 字符串中的 *regex* 匹配项的字符串。如果 *replacement* 的编码与 *original* 或 *regex* 的编码不匹配，则将向错误流写入错误。

*startPosition*

要搜索的 *original* 字符串中的第一个字符。如果 *startPosition* 小于 1，则将向错误流写入错误。如果 *startPosition* 大于 *original* 的长度，则将返回 *original*。

*occurence*

要替换的与 *regex* 表达式匹配的字符串数量。如果 *occurence* 为 0，则将替换所有匹配 *regex* 的子字符串。如果 *occurence* 小于 0，则将向错误流写入错误。

## 示例
<a name="sql-reference-regex-replace-example"></a>

### 示例数据集
<a name="w2aac22c33c17c11b2"></a>

以下示例基于示例股票数据集，后者是[《Amazon Kinesis Analytics 开发人员指南》](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html) 中的*入门练习*的一部分。

要运行每个示例，您需要一个具有样本股票代码输入流的 Amazon Kinesis Analytics 应用程序。要了解如何创建 Analytics 应用程序和配置示例股票代码输入流，请参阅[《Amazon Kinesis Analytics 开发人员指南》](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html) 中的*入门练习*。

具有以下架构的示例股票数据集。

```
(ticker_symbol  VARCHAR(4),
sector          VARCHAR(16),
change          REAL,
price           REAL)
```

### 示例 1：将源字符串中的所有字符串值替换为新值
<a name="w2aac22c33c17c11b4"></a>

在此示例中，如果 `sector` 字段中的所有字符串都与正则表达式匹配，则它们都将被替换。

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
        ticker_symbol VARCHAR(4), 
        SECTOR VARCHAR(24), 
        CHANGE REAL, 
        PRICE REAL);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM"

SELECT STREAM   TICKER_SYMBOL,
                REGEX_REPLACE(SECTOR, 'TECHNOLOGY', 'INFORMATION TECHNOLOGY', 1, 0);
                CHANGE,
                PRICE
FROM "SOURCE_SQL_STREAM_001"
```

上一示例输出的流与以下内容类似。

![\[Table showing stock data with columns for time, ticker symbol, sector, change, and price.\]](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/images/sql-reference-regex-replace.png)


## 注意
<a name="sql-reference-regex-replace-notes"></a>

REGEX\$1REPLACE 不是 SQL:2008 标准的一部分。它是 Amazon Kinesis Data Analytics 流式 SQL 扩展。

如果所有参数都为 `null`，则 REGEX\$1REPLACE 返回 `null`。

# SUBSTRING
<a name="sql-reference-substring"></a>

```
 SUBSTRING ( <source-string> FROM <start-position> [ FOR <string-length> ] )
 SUBSTRING ( <source-string>, <start-position> [ , <string-length> ] )
 SUBSTRING ( <source-string> SIMILAR <pattern> ESCAPE <escape-char> )
 <source-string> := <character-expression>
 <start-position> := <integer-expression>
 <string-length> := <integer-expression>
 <regex-expression> := <character-expression>
 <pattern> := <character-expression>
 <escape-char> := <character-expression>
```

SUBSTRING 将提取第一个参数中指定的源字符串的一部分。提取从 *start-position* 的值或第一个与 *regex-expression* 的值匹配的表达式开始。

如果为 *string-length* 指定一个值，则仅返回该数量的字符。如果字符串中的剩余字符数少于该数量，则仅返回剩余的字符。如果未指定 *string-length*，该字符串长度默认为输入字符串的剩余长度。

如果起始位置小于 1，则会按照起始位置为 1 来解释它，并且字符串长度将减去 (1 - 起始位置)。例如，请参阅以下内容。如果起始位置大于字符串中的字符数，或长度参数为 0，则结果为空字符串。

## 参数
<a name="sql-reference-substring-parameters"></a>

*source-string*

用于搜索位置或正则表达式匹配项的字符串。

*start-position*

要返回的 *source-string* 的第一个字符。如果 *start-position* 大于 *source-string* 的长度，则 SUBSTRING 返回 null。

*string-length*

要返回的 *source-string* 的字符数。

*regex-expression*

要匹配并从 *source-string* 返回的字符模式。仅返回第一个匹配项。

*pattern*

包含以下内容的三部分字符模式：
+ 要在返回的子字符串之前查找的字符串
+ 返回的子字符串
+ 要在返回的子字符串之后查找的字符串

这些部分由一个双引号 (") 和一个指定的转义字符分隔。有关更多信息，请参阅以下[Similar...Escape](#sql-reference-substring-examples-similar)示例。

## 示例
<a name="sql-reference-substring-examples"></a>

### FROM/ FOR
<a name="sql-reference-substring-examples-from-for"></a>


| 函数 | 结果 | 
| --- | --- | 
|  SUBSTRING('123456789' FROM 3 FOR 4)  |  3456  | 
|  SUBSTRING('123456789' FROM 17 FOR 4)  |  <empty string>  | 
|  SUBSTRING('123456789' FROM -1 FOR 4)  |  12  | 
|  SUBSTRING('123456789' FROM 6 FOR 0)  |  <empty string>  | 
|  SUBSTRING('123456789' FROM 8 FOR 4)  |  89  | 

### FROM Regex
<a name="sql-reference-substring-examples-from"></a>


| 函数 | 结果 | 
| --- | --- | 
| SUBSTRING('TECHNOLOGY' FROM 'L[A-Z]\$1') | LOGY | 
| SUBSTRING('TECHNOLOGY' FROM 'FOO') | null | 
| SUBSTRING('TECHNOLOGY' FROM 'O[A-Z]') | OL | 

### 数值
<a name="sql-reference-substring-examples-numeric"></a>


| 函数 | 结果 | 
| --- | --- | 
|  SUBSTRING('123456789', 3, 4)  |  3456  | 
|  SUBSTRING('123456789', 7, 4)  |  789  | 
|  SUBSTRING('123456789', 10, 4)  |  null  | 

### Similar...Escape
<a name="sql-reference-substring-examples-similar"></a>


| 函数 | 结果 | 
| --- | --- | 
|  SUBSTRING('123456789' SIMILAR '23\$1"456\$1"78' ESCAPE '\$1')  |  456  | 
|  SUBSTRING('TECHNOLOGY' SIMILAR 'TECH%"NOLO%"GY' ESCAPE '%')  |  NOLO  | 

## 注意
<a name="sql-reference-substring-notes"></a>
+ Amazon Kinesis Data Analytics 流式 SQL 不支持 SQL:2008 中定义的可选“USING CHARACTERS \$1 OCTETS”子句。只采用 USING CHARACTERS。
+ 上文列出的 SUBSTRING 函数的第二种和第三种形式（使用正则表达式，并使用逗号而不是 FROM...FOR）不是 SQL:2008 标准的一部分。它们是针对 Amazon Kinesis Data Analytics 的流式 SQL 扩展的一部分。

# TRIM
<a name="sql-reference-trim"></a>

```
TRIM ( [ [ <trim-specification> ] [ <trim-character> ] FROM ] <trim-source> )
 <trim-specification> := LEADING | TRAILING | BOTH
 <trim-character> := <character-expression>
 <trim-source> := <character-expression>
```



TRIM 根据修剪规范（即前导、 and/or 尾随或两者）的规定，从修剪源字符串的开头端删除指定修剪字符的实例。如果指定了 LEADING，则仅删除源字符串开头处的重复剪裁字符。如果指定了 TRAILING，则仅删除源字符串结尾处的重复剪裁字符。如果指定了 BOTH，或者完全省略了剪裁说明符，则会从源字符串开头和结尾删除重复项。

如果未明确指定剪裁字符，则默认为空格字符 (' ')。只允许使用一个剪裁字符；指定空字符串或长度超过一个字符的字符串会导致异常。

如果任一输入为 null，则返回 null。

## 示例
<a name="sql-reference-trim-examples"></a>


| 函数 | 结果 | 
| --- | --- | 
|  <pre>TRIM(' Trim front and back ')</pre>  |  'Trim front and back'  | 
|  <pre>TRIM (BOTH FROM ' Trim front and back ')</pre>  |  'Trim front and back'  | 
|  <pre>TRIM (BOTH ' ' FROM ' Trim front and back ')</pre>  |  'Trim front and back'  | 
|  <pre>TRIM (LEADING 'x' FROM 'xxxTrim frontxxx')</pre>  |  'Trim frontxxx'  | 
|  <pre>TRIM (TRAILING 'x' FROM 'xxxTrimxBackxxx')</pre>  |  'xxxTrimxBack'  | 
|  <pre>TRIM (BOTH 'y' FROM 'xxxNo y to trimxxx')</pre>  |  'xxxNo y to trimxxx'  | 

# UPPER
<a name="sql-reference-upper"></a>

```
< UPPER ( <character-expression> )
```

将字符串转换为全大写字符。如果输入参数为 null，则返回 null；如果输入参数为空字符串，则返回空字符串。

## 示例
<a name="sqlrf-upper-examples"></a>


| 函数 | 结果 | 
| --- | --- | 
|  UPPER ('abc DEFghi123 ')  |  ABCDEFGHI123  | 