如何在SQL中移除文本字段内姓氏字母间的空格?
移除姓氏字母间的空格(SQL实现)
针对你筛选出的包含空格分隔大写字母姓氏(如'S M I T H')的文本,以下是不同SQL环境下的处理方法:
SQL Server(适配你的环境)
从你使用的[dbo].[my_table]可以判断是SQL Server环境,这里提供两种精准处理单引号内空格的方案:
方法1:递归CTE批量替换
通过递归查找并移除单引号内的字母间空格,一次性完成处理:
WITH RecursiveReplace AS ( SELECT [TEXT] AS OriginalText, PATINDEX('%''[A-Z] [A-Z]%''', [TEXT]) AS MatchPos, STUFF([TEXT], PATINDEX('%''[A-Z] [A-Z]%''', [TEXT]) + 2, 1, '') AS UpdatedText FROM [dbo].[my_table] WHERE [TEXT] LIKE '% [A-Z] [A-Z] [A-Z] [A-Z]%' -- 你的筛选条件 UNION ALL SELECT OriginalText, PATINDEX('%''[A-Z] [A-Z]%''', UpdatedText) AS MatchPos, STUFF(UpdatedText, PATINDEX('%''[A-Z] [A-Z]%''', UpdatedText) + 2, 1, '') AS UpdatedText FROM RecursiveReplace WHERE MatchPos > 0 ) SELECT DISTINCT OriginalText, UpdatedText FROM RecursiveReplace WHERE MatchPos = 0;
方法2:自定义函数(适合重复调用)
如果需要多次处理这类文本,先创建自定义函数:
CREATE FUNCTION dbo.RemoveSpacesInQuotedName(@inputText NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN WHILE PATINDEX('%''[A-Z] [A-Z]%''', @inputText) > 0 BEGIN SET @inputText = STUFF(@inputText, PATINDEX('%''[A-Z] [A-Z]%''', @inputText) + 2, 1, '') END RETURN @inputText END
再调用函数处理数据:
SELECT [TEXT] AS OriginalText, dbo.RemoveSpacesInQuotedName([TEXT]) AS UpdatedText FROM [dbo].[my_table] WHERE [TEXT] LIKE '% [A-Z] [A-Z] [A-Z] [A-Z]%';
其他数据库参考
- MySQL 8.0+:用
REGEXP_REPLACE直接替换单引号内的空格:
SELECT `TEXT` AS OriginalText, REGEXP_REPLACE(`TEXT`, '(\'[A-Z]) ([A-Z]\')', '$1$2') AS UpdatedText FROM my_table WHERE `TEXT` LIKE '% [A-Z] [A-Z] [A-Z] [A-Z]%';
- PostgreSQL:通过全局正则替换处理:
SELECT "TEXT" AS OriginalText, REGEXP_REPLACE("TEXT", '(\'[A-Z]) ([A-Z])', '\1\2', 'g') AS UpdatedText FROM my_table WHERE "TEXT" LIKE '% [A-Z] [A-Z] [A-Z] [A-Z]%';
注意
以上方案均只针对单引号内的空格分隔大写字母处理,不会误修改文本其他位置的空格。
内容的提问来源于stack exchange,提问作者HEV
相关产品推荐
相关产品推荐

