Замените повторяющиеся пробелы одним пробелом в T-SQL - PullRequest
92 голосов
/ 16 марта 2010

Мне нужно убедиться, что в данном поле не более одного пробела (меня не интересуют все пробелы, только пробел) между символами.

Так

'single    spaces   only'

нужно превратить в

'single spaces only'

ниже не будет работать

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

как бы это привело к

'single  spaces  only'

Я бы действительно предпочел придерживаться собственного T-SQL, а не решения на основе CLR.

Мысли

Ответы [ 15 ]

283 голосов
/ 16 марта 2010

Еще аккуратнее:

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

Выход:

выберите один пробел

22 голосов
/ 16 марта 2010

Это будет работать:

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

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

select @test
13 голосов
/ 16 марта 2010

Если вы знаете, что в строке будет не более определенного количества пробелов, вы можете просто вставить замену:

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
6 голосов
/ 01 декабря 2010
update mytable
set myfield = replace (myfield, '  ',  ' ')
where charindex('  ', myfield) > 0 

Заменитель будет работать со всеми двойными пробелами, не нужно вводить многократные замены Это решение на основе множеств.

5 голосов
/ 16 марта 2010

Это несколько грубая сила, но будет работать

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
4 голосов
/ 11 апреля 2016

Это можно сделать рекурсивно с помощью функции:

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

Внимание:
Символ / строка, используемые для замены пробелов, не должны существовать в начале или конце строки и стоять отдельно.

2 голосов
/ 10 декабря 2015

Вот простая функция, которую я создал для очистки любых пробелов до или после и нескольких пробелов в строке. Он изящно обрабатывает до 108 пробелов за один отрезок и столько же блоков, сколько в строке. Вы можете увеличить это в 8 раз, добавив дополнительные строки с большими кусками пробелов, если вам нужно. Похоже, что он работает быстро и не вызывает каких-либо проблем, несмотря на его общее использование в большом приложении.

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
1 голос
/ 05 февраля 2015

Нашел при поиске ответа:

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

На второй взгляд, похоже, это немного другая версия выбранного ответа.

1 голос
/ 30 ноября 2014

Это решение с помощью множественной замены, которое работает для любых строк (не требует специальных символов, которые не являются частью строки).

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'
0 голосов
/ 01 июля 2019

Я обычно использую этот подход:

declare @s varchar(50)
set @s = 'TEST         TEST'
select REPLACE(REPLACE(REPLACE(@s,' ','[o][c]'),'[c][o]',''),'[o][c]',' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...