string_to_array函数将字符串按指定分隔符切分为text[]数组,基本用法为string_to_array('a,b,c', ',')→{'a','b','c'};支持可选第三参数替换空字段,分隔符不能为空,输入null则返回null。

STRING_TO_ARRAY 函数的基本用法
STRING_TO_ARRAY 是 PostgreSQL 提供的内置函数,用于把字符串按指定分隔符切分成 text[] 类型数组。它接受两个必需参数:待拆分的字符串和分隔符;第三个参数(可选)是当遇到空字段时用来替代的值。
最常见写法是:STRING_TO_ARRAY('a,b,c', ',') → {'a','b','c'}。注意分隔符必须是 text 类型,哪怕只是一个空格或制表符,也得写成 ' ' 或 E' '。
容易踩的坑:
- 传入
NULL字符串时,结果直接是NULL数组,不是空数组{} - 分隔符为空字符串
''会报错:ERROR: zero-length delimiter - 如果原字符串结尾有多余分隔符(如
'a,b,c,'),默认会产生一个末尾空元素'a','b','c',''
处理空字段和 NULL 值的第三参数
第三个参数控制「连续分隔符」或「开头/结尾分隔符」产生的空字段如何表示。例如:STRING_TO_ARRAY('a,,c', ',', 'NULL') 返回 {'a','NULL','c'} —— 注意这里 'NULL' 是字面量字符串,不是 SQL 的 NULL 值。
这个参数只影响内容,不改变数组长度或结构。实际中常用它来统一标记缺失字段,方便后续用 NULLIF(col, 'NULL') 转换。
典型场景:
- 解析 CSV 导入的原始文本行,其中某些字段为空
- 从日志字段里提取用竖线分隔的标签:
STRING_TO_ARRAY(log_tags, '|', '')把空位留成空字符串便于过滤 - 避免因空字段导致
UNNEST后出现意外的NULL行
与 SPLIT_PART、REGEXP_SPLIT_TO_ARRAY 的区别
STRING_TO_ARRAY 是简单分隔符切分,不支持正则、不支持取第 N 段。别把它和这些函数混淆:
-
SPLIT_PART('a-b-c', '-', 2)→'b':只能取单个片段,不能返回数组 -
REGEXP_SPLIT_TO_ARRAY('a, b, c', E'\s*,\s*')→{'a','b','c'}:支持正则,能自动 trim 空格,但性能略低,且在老版本 PostgreSQL( -
STRING_TO_ARRAY在所有支持版本中都可用,且对固定分隔符场景最快
如果你要处理带引号、转义、嵌套结构的 CSV,别硬扛 —— STRING_TO_ARRAY 不是 CSV 解析器,该用 COPY 或外部工具就用。
数组结果的常见后续操作
得到数组后,常需展开、过滤或聚合。记住几个关键点:
- 用
UNNEST(arr)展开成行,但注意它会丢弃空数组和NULL数组输入 - 判断是否包含某值:
'x' = ANY(arr)比arr @> ARRAY['x']更直观,且能走索引(如果字段有GIN索引) - 去重并排序:
ARRAY(SELECT DISTINCT UNNEST(arr) ORDER BY 1),但注意这会丢失原始顺序 - 拼回字符串:
ARRAY_TO_STRING(arr, ','),它默认把NULL元素转为空字符串,必要时加第三参数控制
真正麻烦的是嵌套结构或动态分隔符 —— 这时候函数本身没坏,只是你选错了抽象层级。先确认数据格式是否真的适合用 STRING_TO_ARRAY 处理,比调参重要得多。










