
# 分割字符串
#### regexp_split_to_array(string text, pattern text \[, flags text \])
描述：用POSIX正则表达式作为分隔符，分隔string。和regexp_split_to_table相同，不过regexp_split_to_array会把它的结果以一个text数组的形式返回。
返回值类型：text\[\]
示例：
```
SELECT regexp_split_to_array('hello world', E'\\s+');
 regexp_split_to_array
-----------------------
 {hello,world}
(1 row)
```
#### regexp_split_to_table(string text, pattern text \[, flags text\])
描述：用POSIX正则表达式作为分隔符，分隔string。如果没有与pattern的匹配，该函数返回string。如果有至少有一个匹配，对每一个匹配它都返回从上一个匹配的末尾（或者串的开头）到这次匹配开头之间的文本。当没有更多匹配时，它返回从上一次匹配的末尾到串末尾之间的文本。
flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配，g表示替换每一个匹配的子字符串而不仅仅是第一个。
返回值类型：setof text
示例：
```
SELECT regexp_split_to_table('hello world', E'\\s+');
 regexp_split_to_table
-----------------------
 hello
 world
(2 rows)
```
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/caution_3.0-zh-cn.png)
如果没有子查询，当regexp_split_to_table函数没有匹配上时，会导致原始行被过滤掉。如果业务需要保留原始行，应避免这种写法。
```
SELECT * FROM tab;
 c1  | c2  
-----+-----
 dws |
(1 row)
SELECT c1, regexp_split_to_table(c2, E'\\s+') FROM tab;
 c1 | regexp_split_to_table 
----+-----------------------
(0 rows)
SELECT c1, (select regexp_split_to_table(c2, E'\\s+')) FROM tab;
 c1  | regexp_split_to_table 
-----+-----------------------
 dws | 
(1 row)
```
#### split_part(string text, delimiter text, field int)
描述：将原字符串根据指定的分隔符（delimiter参数）分割成若干个部分，然后提取指定位置（field参数）的部分。该函数适用于从复合字符串中提取特定字段。
参数说明：
- string，要分割的原字符串。
- delimiter，用于分割字符串的分隔符。
- field，分割后要获取的部分，从1开始计数。
返回值类型：text
示例：
将字符串"abc\~@\~def\~@\~ghi"按照"\~@\~"分隔符进行分割，得到3个部分（abc，def，ghi），提取第2部分内容，即"def"。
```
SELECT split_part('abc~@~def~@~ghi', '~@~', 2);
 split_part
------------
 def
(1 row)
```
