如何在清理特殊字符与冗余空格时保留字符串默认双空格?
保留原字符串默认双空格的SQL处理方案
问题背景
原字符串:'AMERICAN:BEER~ INVENTIONS CHOCOLATE-FEVER'
需求:将特殊字符(:、~、-、<、>、(、)、#)替换为空格,同时保留原字符串中INVENTIONS与CHOCOLATE之间的默认双空格,最终得到结果:'AMERICAN BEER INVENTIONS CHOCOLATE FEVER'
当前处理流程的问题:先替换特殊字符为空格,再通过循环将所有双空格替换为单空格,导致原本需要保留的默认双空格也被删除。
解决方案
核心思路是先标记需要保留的双空格为唯一占位符,待处理完其他空格问题后再还原占位符为双空格,具体分两种场景:
场景1:仅保留特定位置的双空格
如果只需要保留固定位置的双空格(比如INVENTIONS与CHOCOLATE之间的双空格),执行以下步骤:
标记目标双空格
将特定位置的双空格替换为一个不会出现在文本中的特殊占位符:SET @str = REPLACE(@str, 'INVENTIONS CHOCOLATE', 'INVENTIONS@@DOUBLE_SPACE@@CHOCOLATE');替换所有特殊字符为空格
完善原替换逻辑,加入遗漏的-字符:UPDATE xxxx.xxxxx SET xxxx = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(xxxx, '<', ' '), '>', ' '), '(', ' '), ')', ' '), ':', ' '), '#', ' '), '~', ' '), '-', ' ') WHERE xxxx LIKE '%[<>():#~-]%';清理多余连续空格
此时字符串中仅存在单空格和标记的占位符,循环替换双空格为单空格即可:SET @str = TRIM(@str); WHILE CHARINDEX(' ', @str) > 0 SET @str = REPLACE(@str, ' ', ' ');还原占位符为双空格
将标记的占位符替换回双空格:SET @str = REPLACE(@str, '@@DOUBLE_SPACE@@', ' ');
场景2:保留所有原有的双空格
如果需要保留字符串中所有原本存在的双空格,直接执行以下完整逻辑:
-- 1. 标记所有原有双空格为占位符 SET @str = REPLACE(@str, ' ', '@@DOUBLE_SPACE@@'); -- 2. 替换所有特殊字符为单空格 SET @str = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@str, '<', ' '), '>', ' '), '(', ' '), ')', ' '), ':', ' '), '#', ' '), '~', ' '), '-', ' '); -- 3. 清理特殊字符替换产生的连续空格 SET @str = TRIM(@str); WHILE CHARINDEX(' ', @str) > 0 SET @str = REPLACE(@str, ' ', ' '); -- 4. 还原所有标记的双空格 SET @str = REPLACE(@str, '@@DOUBLE_SPACE@@', ' ');
内容的提问来源于stack exchange,提问作者Daxesh Radadiya
相关产品推荐
相关产品推荐

