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

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

Так

'single    spaces   only'

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

'single spaces only'

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

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

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

'single  spaces  only'

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

Мысли

Ответы [ 15 ]

0 голосов
/ 17 мая 2019
 DECLARE @str varchar(150)
SET @str='Hello    My   name  is Jiyaul   mustafa'
Select REPLACE(REPLACE(REPLACE(@str,' ','{}'),'}{',''),'{}',' ')
0 голосов
/ 06 марта 2019

Я использую FOR XML PATH для замены нескольких пробелов в один пробел

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

Вот как можно вызывать финальную функцию UDF

select dbo.ReplaceMultipleSpaces('   Sample   text  with  multiple  space     ')
0 голосов
/ 20 марта 2017

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

select Regexp_Replace('single    spaces   only','( ){2,}', ' ') from dual;
0 голосов
/ 12 апреля 2016

Метод № 1

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

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

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

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

0 голосов
/ 03 января 2014
update mytable
set myfield = replace(myfield, '  ',  ' ')
where myfield like '%  %'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...