SQL中如何仅移除字符串首尾位置的换行符
SQL移除字符串首尾换行符的实现方案
你之前尝试的两个方案存在明确的适用局限:
trim(field)默认仅移除首尾的半角空格,无法识别换行符\n、回车符\r类的空白字符,因此无法去除首尾换行REPLACE(field,'\n','')为全局匹配替换,会删除字符串所有位置的换行,无法保留字符串中间的换行内容
以下是不同场景下的可行实现:
主流数据库简洁写法
绝大多数主流数据库的TRIM函数支持自定义要移除的首尾字符,注意Windows系统生成的文本换行通常为\r\n组合,建议同时处理回车、换行两类字符避免遗漏:
- MySQL / MariaDB / PostgreSQL
-- 仅移除首尾\n的话把参数里的\r删掉即可 SELECT TRIM(BOTH '\r\n' FROM field) AS trimmed_field FROM your_table; - SQL Server 2017及以上版本
-- CHAR(10)对应\n,CHAR(13)对应\r SELECT TRIM(CHAR(13) + CHAR(10) FROM field) AS trimmed_field FROM your_table; - Oracle
Oracle原生TRIM仅支持单字符移除,可以嵌套调用实现两类字符的清理:SELECT TRIM(CHR(10) FROM TRIM(CHR(13) FROM field)) AS trimmed_field FROM your_table;
低版本数据库兼容写法
如果你的数据库不支持自定义TRIM移除字符,可以通过递归逐字符判断首尾、截断的方式实现,完全不会改动字符串中间的换行内容,以MySQL为例:
WITH RECURSIVE trim_leading AS ( SELECT id, field AS original_field, field AS tmp_str FROM your_table UNION ALL SELECT id, original_field, SUBSTRING(tmp_str, 2) FROM trim_leading WHERE LEFT(tmp_str,1) IN ('\n','\r') ), trim_tailing AS ( SELECT id, tmp_str AS lead_done_str, tmp_str AS tmp_str2 FROM ( SELECT id, tmp_str, ROW_NUMBER() OVER (PARTITION BY id ORDER BY LENGTH(tmp_str) ASC) AS rn FROM trim_leading ) t WHERE rn = 1 UNION ALL SELECT id, lead_done_str, SUBSTRING(tmp_str2, 1, LENGTH(tmp_str2)-1) FROM trim_tailing WHERE RIGHT(tmp_str2,1) IN ('\n','\r') ) SELECT id, original_field, tmp_str2 AS trimmed_field FROM ( SELECT id, original_field, tmp_str2, ROW_NUMBER() OVER (PARTITION BY id ORDER BY LENGTH(tmp_str2) ASC) AS rn FROM trim_tailing ) t WHERE rn = 1;
如果业务场景仅需要移除\n类换行,不需要处理\r回车,把上述判断逻辑里的'\r'匹配项删除即可。
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

