用T-SQL中的单个空格replace重复的空格

我需要确保给定的字段在字符之间没有多于一个空格(我不关心所有的空格,只是空格)。

所以

'single spaces only' 

需要变成

 'single spaces only' 

以下将无法正常工作

 select replace('single spaces only',' ',' ') 

因为它会导致

 'single spaces only' 

我真的宁愿坚持原生T-SQL而不是基于CLR的解决scheme。

思考?

更整洁:

 select string = replace(replace(replace(' select single spaces',' ','<>'),'><',''),'<>',' ') 

输出:

select单个空格

这将工作:

 declare @test varchar(100) set @test = 'this is a test' while charindex(' ',@test ) > 0 begin set @test = replace(@test, ' ', ' ') end select @test 

如果你知道连续的空间不会超过一定的空间,你可以嵌套replace:

 replace(replace(replace(replace(myText,' ',' '),' ',' '),' ',' '),' ',' ') 

4replace应该固定多达16个连续的空格(16,然后8,然后4,然后2,然后1)

如果它可能会更长,那么你必须做一些内联函数:

 CREATE FUNCTION strip_spaces(@str varchar(8000)) RETURNS varchar(8000) AS BEGIN WHILE CHARINDEX(' ', @str) > 0 SET @str = REPLACE(@str, ' ', ' ') RETURN @str END 

那就做吧

 SELECT dbo.strip_spaces(myText) FROM myTable 

这有点蛮力,但会起作用

 CREATE FUNCTION stripDoubleSpaces(@prmSource varchar(max)) Returns varchar(max) AS BEGIN WHILE (PATINDEX('% %', @prmSource)>0) BEGIN SET @prmSource = replace(@prmSource ,' ',' ') END RETURN @prmSource END GO -- Unit test -- PRINT dbo.stripDoubleSpaces('single spaces only') single spaces only 
 update mytable set myfield = replace (myfield, ' ', ' ') where charindex(' ', myfield) > 0 

replace将在所有的双空间工作,不需要放置多个replace。 这是基于集合的解决scheme。

这是我创build的一个简单的函数,用于清理之前或之后的任何空格,以及string中的多个空格。 它优雅地处理在一个单一的伸展约108个空间和string中的块数。 如果需要的话,可以通过添加更多的空格块来增加8倍。 尽pipe它在大型应用程序中被广泛使用,但似乎performance得很快并且没有引起任何问题。

 CREATE FUNCTION [dbo].[fnReplaceMultipleSpaces] (@StrVal AS VARCHAR(4000)) RETURNS VARCHAR(4000) AS BEGIN SET @StrVal = Ltrim(@StrVal) SET @StrVal = Rtrim(@StrVal) SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 16 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 8 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 4 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 2 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 2 spaces (for odd leftovers) RETURN @StrVal END 

挖掘答案时发现这个:

 SELECT REPLACE( REPLACE( REPLACE( LTRIM(RTRIM('1 2 3 4 5 6')) ,' ',' '+CHAR(7)) ,CHAR(7)+' ','') ,CHAR(7),'') AS CleanString where charindex(' ', '1 2 3 4 5 6') > 0 

完整的答案(与解释)从以下url取得: http : //techtipsbysatish.blogspot.com/2010/08/sql-server-replace-multiple-spaces-with.html

再看看,似乎只是选定的答案略有不同的版本。

这是通过多个replace的解决scheme,它适用于任何string(不需要特殊字符,不是string的一部分)。

 declare @value varchar(max) declare @result varchar(max) set @value = 'alpha beta gamma delta xyz' set @result = replace(replace(replace(replace(replace(replace(replace( @value,'a','ac'),'x','ab'),' ',' x'),'x ',''),'x',''),'ab','x'),'ac','a') select @result -- 'alpha beta gamma delta xyz' 

它可以通过recursion函数来完成

 CREATE FUNCTION dbo.RemSpaceFromStr(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS BEGIN RETURN (CASE WHEN CHARINDEX(' ', @str) > 0 THEN dbo.RemSpaceFromStr(REPLACE(@str, ' ', ' ')) ELSE @str END); END 

那么,例如:

 SELECT dbo.RemSpaceFromStr('some string with many spaces') AS NewStr 

收益:

 NewStr some string with many spaces 

或者基于@ agdk26或@Neil Knight描述的方法(但更安全)
两个例子都返回上面的输出

 SELECT REPLACE(REPLACE(REPLACE('some string with many spaces' , ' ', ' ' + CHAR(7)), CHAR(7) + ' ', ''), ' ' + CHAR(7), ' ') AS NewStr --but it remove CHAR(7) (Bell) from string if exists... 

要么

 SELECT REPLACE(REPLACE(REPLACE('some string with many spaces' , ' ', ' ' + CHAR(7) + CHAR(7)), CHAR(7) + CHAR(7) + ' ', ''), ' ' + CHAR(7) + CHAR(7), ' ') AS NewStr --but it remove CHAR(7) + CHAR(7) from string 

怎么运行的: 在这里输入图像描述

警告:
用于replace空格的字符/string不应该存在于string的开头或结尾,而是独立存在。

方法#1

第一种方法是用不常见的符号组合将单词之间的多余空格replace为临时标记。 然后,您可以使用replace函数而不是循环replace临时标记符号。

这里是一个替代Stringvariables中的文本的代码示例。

 DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!'; SELECT REPLACE(REPLACE(REPLACE(@testString, ' ', '*^'), '^*', ''), '*^', ' '); 

执行时间testing#1:在这种replace方法的十次运行中,服务器应答的平均等待时间是1.7毫秒,总执行时间是4.6毫秒。 执行时间testing#2:服务器应答的平均等待时间为1.7毫秒,总执行时间为3.7毫秒。

方法#2

第二种方法并不像第一种方法那样优雅,而且也完成了工作。 该方法通过嵌套四个(或者可选地多个)replace语句来替代两个空白空间。

 DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!'; SELECT REPLACE(REPLACE(REPLACE(REPLACE(@testString,' ',' '),' ',' '),' ',' '),' ',' ') 

执行时间testing#1:在这种replace方法的十次运行中,服务器应答的平均等待时间是1.9毫秒,总执行时间是3.8毫秒。 执行时间testing#2:服务器应答的平均等待时间为1.8毫秒,总执行时间为4.8毫秒。

方法#3

replace单词之间多余空格的第三种方法是使用一个简单的循环。 您可以在while循环中检查多余的空格,然后使用replace函数来减less循环的每次迭代中的额外空间。

 DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!'; WHILE CHARINDEX(' ',@testString) > 0 SET @testString = REPLACE(@testString, ' ', ' ') SELECT @testString 

执行时间testing#1:在此replace方法的十次运行中,服务器应答的平均等待时间为1.8毫秒,总执行时间为3.4毫秒。 执行时间testing#2:服务器应答的平均等待时间为1.9毫秒,总执行时间为2.8毫秒。

 update mytable set myfield = replace(myfield, ' ', ' ') where myfield like '% %' 

尝试这个..

你可以试试这个:

 select Regexp_Replace('single spaces only','( ){2,}', ' ') from dual;