PostgreSQL使用string_to_array无法按换行符分割字符串求助
PostgreSQL按换行符分割字符串的问题解决
问题根源
你用'\r\n'作为分隔符无效,是因为PostgreSQL的普通单引号字符串不解析反斜杠转义——写在单引号里的\r\n会被当成四个字面字符:\、r、\、n,而不是实际的CRLF换行符。直接用实际换行符有效,是因为你传入的是真实的换行字符,而非转义序列。
正确的解决方式
1. 使用转义字符串(推荐)
在字符串前加E,让PostgreSQL解析反斜杠转义:
SELECT string_to_array('Test1 Test2', E'\r\n');
如果你的CSV数据是Unix风格的LF换行(仅\n),就用E'\n'作为分隔符。
2. 用ASCII码生成换行符
通过chr()函数直接生成对应ASCII码的换行字符:
- CRLF(Windows换行):
chr(13)||chr(10) - LF(Unix换行):
chr(10) - CR(旧Mac换行):
chr(13)
示例代码:
-- 处理CRLF换行 SELECT string_to_array('Test1 Test2', chr(13)||chr(10)); -- 处理LF换行 SELECT string_to_array('Test1 Test2', chr(10));
3. 先确认数据中的换行符类型
从CSV导入的数据可能因系统不同使用不同换行符,你可以先查询确认:
-- 取字段最后一个字符的ASCII码,判断换行类型 SELECT ascii(substring(your_column from '.{1}$')) FROM your_table LIMIT 1;
- 返回10 → LF换行
- 返回13 → CR换行
- 如果是CRLF,可检查倒数第二个字符:
ascii(substring(your_column from '.{2}$' for 1))
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

