用单个空格替换重复空白的SQL方法

时间:2010-02-02 09:08:22

标签: sql

是否有更优雅的方式来做到这一点。我想用单个空格替换重复的空白....

   declare @i int

    set @i=0
    while @i <= 20
    begin
        update myTable
        set myTextColumn = replace(myTextColumn, '  ', ' ')
        set @i=@i+1
    end

(它的sql server 2000 - 但我更喜欢通用SQL)

15 个答案:

答案 0 :(得分:29)

这有效:

UPDATE myTable
SET myTextColumn =
    REPLACE(
        REPLACE(
            REPLACE(myTextColumn
                ,'  ',' '+CHAR(1)) -- CHAR(1) is unlikely to appear
        ,CHAR(1)+' ','')
    ,CHAR(1),'')
WHERE myTextColumn LIKE '%  %'

完全基于集合;没有循环。

所以我们用不寻常的角色和空格替换任何两个空格。如果我们调用异常字符X,则5个空格变为:'X X'和6个空格变为'X X X'。然后我们用空字符串替换'X'。因此,5个空格变为'',6个空格变为'X'。然后,如果有偶数个空格,我们删除任何剩余的'X',留下一个空格。

答案 1 :(得分:28)

这是一个简单的基于集合的方法,通过应用三个替换将多个空格折叠到一个空格中。

DECLARE @myTable TABLE (myTextColumn VARCHAR(50))

INSERT INTO @myTable VALUES ('0Space')
INSERT INTO @myTable VALUES (' 1 Spaces 1 Spaces. ')
INSERT INTO @myTable VALUES ('  2  Spaces  2  Spaces.  ')
INSERT INTO @myTable VALUES ('   3   Spaces  3   Spaces.   ')
INSERT INTO @myTable VALUES ('    4    Spaces  4    Spaces.    ')
INSERT INTO @myTable VALUES ('     5     Spaces  5     Spaces.     ')
INSERT INTO @myTable VALUES ('      6      Spaces  6      Spaces.      ')

select replace(
          replace(
             replace(
                LTrim(RTrim(myTextColumn)), ---Trim the field
             '  ',' |'),                    ---Mark double spaces
          '| ',''),                         ---Delete double spaces offset by 1
       '|','')                              ---Tidy up
       AS SingleSpaceTextColumn
 from @myTable

现在可以根据以下内容设置您的Update语句:

 update @myTable
    set myTextColumn = replace(
                          replace(
                             replace(
                                LTrim(RTrim(myTextColumn)),
                             '  ',' |'),
                          '| ',''),
                       '|','')  

使用适当的Where子句将Update限制为只需要更新或可能有双倍空格的行。

示例:

where 1<=Patindex('%  %', myTextColumn)

我找到了一个关于此方法的外部记录:REPLACE Multiple Spaces with One

答案 2 :(得分:4)

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

Replace duplicate spaces with a single space in T-SQL

答案 3 :(得分:3)

不是很基于SET但是简单的WHILE可以解决这个问题。

CREATE TABLE #myTable (myTextColumn VARCHAR(32))

INSERT INTO #myTable VALUES ('NoSpace')
INSERT INTO #myTable VALUES ('One Space')
INSERT INTO #myTable VALUES ('Two  Spaces')
INSERT INTO #myTable VALUES ('Multiple    Spaces    .')

WHILE EXISTS (SELECT * FROM #myTable WHERE myTextColumn LIKE '%  %')
  UPDATE  #myTable 
  SET     myTextColumn = REPLACE(myTextColumn, '  ', ' ') 
  WHERE   myTextColumn LIKE '%  %'

SELECT * FROM #myTable

DROP TABLE #myTable

答案 4 :(得分:3)

SELECT 'starting...' --sets @@rowcount
WHILE @@rowcount <> 0
    update myTable
    set myTextColumn = replace(myTextColumn, '  ', ' ')
    where myTextColumn like '%  %'

答案 5 :(得分:2)

逐个浏览字符,并保留前一个字符的记录。如果当前字符是空格,并且最后一个字符是空格stuff它。

CREATE FUNCTION [dbo].[fnRemoveExtraSpaces]  (@Number AS varchar(1000))
Returns Varchar(1000)
As
Begin
Declare @n int  -- Length of counter
Declare @old char(1)

Set @n = 1
--Begin Loop of field value
While @n <=Len (@Number)
    BEGIN
     If Substring(@Number, @n, 1) = ' ' AND @old = ' '
      BEGIN
        Select @Number = Stuff( @Number , @n , 1 , '' )
      END
     Else
      BEGIN
       SET @old = Substring(@Number, @n, 1)
       Set @n = @n + 1
      END
    END
Return @number
END
GO


select [dbo].[fnRemoveExtraSpaces]('xxx     xxx     xxx    xxx')

答案 6 :(得分:0)

create table blank(
field_blank char(100))

insert into blank values('yyy      yyyy')
insert into blank values('xxxx    xxxx')
insert into blank values ('xxx    xxx')
insert into blank values ('zzzzzz zzzzz')

update blank 
set field_blank = substring(field_blank,1,charindex(' ',field_blank)-1) + ' ' + ltrim(substring(field_blank,charindex(' ',field_blank) + 1,len(field_blank)))
where CHARINDEX (' ' , rtrim(field_blank)) > 1

select * from blank

答案 7 :(得分:0)

对我来说,上面的例子几乎是一个技巧,但我需要一些更稳定,独立于表或列或一定数量的迭代的东西。所以这是我对大多数上述查询的修改。

CREATE FUNCTION udfReplaceAll 
(
    @OriginalText NVARCHAR(MAX),
    @OldText NVARCHAR(MAX),
    @NewText NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    WHILE (@OriginalText LIKE '%' + @OldText + '%')
    BEGIN
        SET @OriginalText = REPLACE(@OriginalText,@OldText,@NewText)
    END

    RETURN @OriginalText
END
GO

答案 8 :(得分:0)

让我们说,您的数据就像这样

Table name : userdata Field: id, comment, status, 

 id,  "I love -- -- - -spaces  -- -    my INDIA" , "Active" <br>
 id,  "I love -- -- - -spaces  -- -    my INDIA" , "Active" <br>
 id,  "I love -- -- - -spaces  -- -    my INDIA" , "Active" <br>
 id,  "I love -- -- - -spaces  -- -    my INDIA" , "Active" <br>

所以就这样做

update userdata set comment=REPLACE(REPLACE(comment," ","-SPACEHERE-"),"-SPACEHERE"," ");

我没有测试过,但我认为这样可行。

答案 9 :(得分:0)

这是最简单的解决方案:)

    update myTable
    set myTextColumn = replace(replace(replace(LTrim(RTrim(myTextColumn )),' ','<>'),'><',''),'<>',' ')

答案 10 :(得分:0)

试试这个:

UPDATE Ships
SET name = REPLACE(REPLACE(REPLACE(name, '  ', ' ' + CHAR(1)), CHAR(1) + ' ', ''), CHAR(1), '')
WHERE name LIKE '%  %'

答案 11 :(得分:0)

REPLACE(REPLACE(REPLACE(myTextColumn,' ',' %'),'% ',''),'%','')

上面的陈述在用单个空格替换多个空格方面起到了极大的作用。 (可选)添加LTRIMRTRIM以删除开头的空格。

从这里得到它:http://burnignorance.com/database-tips-and-tricks/remove-multiple-spaces-from-a-string-using-sql-server/

答案 12 :(得分:0)

WHILE
 (SELECT count(myIDcolumn) 
  from myTable where myTextColumn like '%  %') > 0
BEGIN
  UPDATE myTable 
  SET myTextColumn = REPLACE(myTextColumn ,'  ',' ')
END

答案 13 :(得分:-1)

尝试一下:

CREATE OR REPLACE FUNCTION REM_SPACES (TEXTO VARCHAR(2000))

    RETURNS VARCHAR(2000)

    LANGUAGE SQL

    READS SQL DATA
BEGIN

    SET TEXTO = UPPER(LTRIM(RTRIM(TEXTO)));

    WHILE LOCATE('  ',TEXTO,1) >= 1 DO
        SET TEXTO = REPLACE(TEXTO,'  ',' ');
    END WHILE;

RETURN TEXTO;

END

答案 14 :(得分:-2)

Update myTable set myTextColumn = replace(myTextColumn, '  ', ' ');

上述查询将删除所有带有单个空格的双空格

但这只会工作一次。