在T-SQL中用一个空格替换重复的空格

时间:2010-03-16 15:37:56

标签: sql-server tsql

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

所以

'single    spaces   only'

需要变成

'single spaces only'

以下不起作用

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

因为它会导致

'single  spaces  only'

我更愿意坚持使用原生T-SQL而不是基于CLR的解决方案。

思想?

17 个答案:

答案 0 :(得分:280)

更整洁:

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

输出:

  

选择单个空格

答案 1 :(得分:21)

这样可行:

declare @test varchar(100)
set @test = 'this   is  a    test'

while charindex('  ',@test  ) > 0
begin
   set @test = replace(@test, '  ', ' ')
end

select @test

答案 2 :(得分:12)

如果您知道连续的空格不会超过一定数量,您可以嵌套替换:

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

4次替换应该最多可以修复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

答案 3 :(得分:6)

update mytable
set myfield = replace (myfield, '  ',  ' ')
where charindex('  ', myfield) > 0 

替换将适用于所有双倍空格,无需多次替换。这是基于集合的解决方案。

答案 4 :(得分:5)

这有点蛮力,但会起作用

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

答案 5 :(得分:4)

可以通过函数递归完成:

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

工作原理: enter image description here

<强>注意:
用于替换空格的字符/字符串不应该存在于字符串的开头或结尾,而是独立存在。

答案 6 :(得分:2)

这是我创建的一个简单函数,用于清除之前或之后的任何空格,以及字符串中的多个空格。它可以在一个拉伸中优雅地处理多达108个空格,并且在字符串中可以处理多个块。如果需要,可以通过添加具有更大空间块的其他行来增加8倍。尽管它在大型应用程序中的普遍使用,它似乎可以快速执行并且没有引起任何问题。

Text' of type

答案 7 :(得分:1)

在寻找答案时找到了这个:

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

完整答案(附带解释)来自:http://techtipsbysatish.blogspot.com/2010/08/sql-server-replace-multiple-spaces-with.html

第二眼看,似乎只是所选答案的略有不同版本。

答案 8 :(得分:1)

这是通过多次替换的解决方案,适用于任何字符串(不需要特殊字符,不属于字符串)。

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'

答案 9 :(得分:0)

方法#1

第一种方法是用不常见的符号组合替换单词之间的额外空格作为临时标记。然后,您可以使用替换函数而不是循环来替换临时标记符号。

这是一个替换String变量中文本的代码示例。

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

执行时间测试#1:在此替换方法的十次运行中,服务器回复的平均等待时间为1.7毫秒,总执行时间为4.6毫秒。 执行时间测试#2:服务器回复的平均等待时间为1.7毫秒,总执行时间为3.7毫秒。

方法#2

第二种方法不如第一种方法那么优雅,但也可以完成工作。此方法通过嵌套四个(或可选更多)替换语句来替换两个空格和一个空格。

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

执行时间测试#1:在此替换方法的十次运行中,服务器回复的平均等待时间为1.9毫秒,总执行时间为3.8毫秒。 执行时间测试#2:服务器回复的平均等待时间为1.8毫秒,总执行时间为4.8毫秒。

方法#3

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

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

执行时间测试#1:在此替换方法的十次运行中,服务器回复的平均等待时间为1.8毫秒,总执行时间为3.4毫秒。 执行时间测试#2:服务器回复的平均等待时间为1.9毫秒,总执行时间为2.8毫秒。

答案 10 :(得分:0)

我对replace multiple spaces into single space使用FOR XML PATH解决方案

这个想法是用XML标签代替空格 然后将XML字符串拆分为没有XML标签的字符串片段 最后,通过在两个字符串之间添加单个空格字符来串联这些字符串值。

以下是最终UDF函数的调用方式

select dbo.ReplaceMultipleSpaces('   Sample   text  with  multiple  space     ')

答案 11 :(得分:0)

 DECLARE @str varchar(150)
SET @str='Hello    My   name  is Jiyaul   mustafa'
Select REPLACE(REPLACE(REPLACE(@str,' ','{}'),'}{',''),'{}',' ')

答案 12 :(得分:0)

我通常使用这种方法:

declare @s varchar(50)
set @s = 'TEST         TEST'
select REPLACE(REPLACE(REPLACE(@s,' ','[o][c]'),'[c][o]',''),'[o][c]',' ')

答案 13 :(得分:0)

只需添加另一种方法-

在SQL Server中不使用REPLACE而不用单个空间替换多个空间-

DECLARE @TestTable AS TABLE(input VARCHAR(MAX));

INSERT INTO @TestTable VALUES
('HAPPY         NEWYEAR     2020'),
('WELCOME       ALL     !');

SELECT
    CAST('<r><![CDATA[' + input + ']]></r>' AS XML).value('(/r/text())[1] cast as xs:token?','VARCHAR(MAX)')
    AS Expected_Result
FROM @TestTable;

--OUTPUT
/*
Expected_Result
HAPPY NEWYEAR 2020
WELCOME ALL !
*/

答案 14 :(得分:0)

请在下面找到代码

select trim(string_agg(value,' ')) from STRING_SPLIT('  single    spaces   only  ',' ')
where value<>' '

这对我有用。 希望这会有所帮助...

答案 15 :(得分:-2)

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

试试这个..

答案 16 :(得分:-3)

你可以试试这个:

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