Замените повторяющиеся пробелы одним пробелом в T-SQL
мне нужно убедиться, что данное поле не имеет более одного пробела (меня не волнует все пробелы, просто пространство) между символами.
так
'single spaces only'
должен быть включен в
'single spaces only'
ниже не будет работать
select replace('single spaces only',' ',' ')
как это приведет к
'single spaces only'
Я бы предпочел придерживаться собственного T-SQL, а не решения на основе CLR.
мысли?
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) > 0Replace будет работать на всех двойных пространствах,не нужно вставлять несколько замен. Это решение.
Это несколько грубая сила, но будет работать
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внимание:
Символ / строка, используемая для замены пробелов, не должна существовать начало или конец строки и стоять в одиночку.
вот простая функция, которую я создал для чистки пробелов до или после, и несколько пробелов в строке. Он изящно обрабатывает до 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 миллисекунды.

Comments