Замените повторяющиеся пробелы одним пробелом в T-SQL



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



так



'single    spaces   only'


должен быть включен в



'single spaces only'


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



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


как это приведет к



'single  spaces  only'


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



мысли?

1840   13  

13 ответов:

даже опрятнее:

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

выход:

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

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

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(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
update mytable
set myfield = replace (myfield, '  ',  ' ')
where charindex('  ', myfield) > 0 

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

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

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

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

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

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

вот простая функция, которую я создал для чистки пробелов до или после, и несколько пробелов в строке. Он изящно обрабатывает до 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

нашел это, копая для ответа:

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

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

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

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'

Способ #1

первый метод заключается в замене дополнительных пробелов между словами с необычной комбинацией символов в качестве временного маркера. Затем вы можете заменить временные маркерные символы, используя функцию replace, а не цикл.

вот пример кода, который заменяет текст в строковую переменную.

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 миллисекунды.

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

попробуйте это..

вы можете попробовать это:

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

Comments

  1. Прош
    Прош 3 года назад
    <p>replace(replace(replace(long_description1,' ','&lt;&gt;'),'&gt;&lt;',''),'&lt;&gt;',' ')</p>