132 votes

Remplacer les espaces en double par un seul espace en T-SQL

Je dois m'assurer qu'un champ donné ne comporte pas plus d'un espace (je ne me préoccupe pas de tous les espaces blancs, seulement des espaces) entre les caractères.

Alors

'single    spaces   only'

doit être transformé en

'single spaces only'

Les éléments ci-dessous ne fonctionneront pas

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

car il en résulterait

'single  spaces  only'

Je préférerais vraiment m'en tenir au langage T-SQL natif plutôt qu'à une solution basée sur le CLR.

Qu'en pensez-vous ?

414voto

Neil Knight Points 23759

Encore plus ordonné :

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

Sortie :

sélectionnez les espaces uniques

32voto

James Wiseman Points 18347

Cela pourrait fonctionner :

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

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

select @test

23voto

BradC Points 18833

Si vous savez qu'il n'y aura pas plus d'un certain nombre d'espaces dans une rangée, vous pouvez simplement imbriquer le remplacement :

replace(replace(replace(replace(myText,'  ',' '),'  ',' '),'  ',' '),'  ',' ')

4 remplacements doivent fixer jusqu'à 16 espaces consécutifs (16, puis 8, puis 4, puis 2, puis 1).

Si elle pouvait être beaucoup plus longue, il faudrait alors faire quelque chose comme une fonction en ligne :

CREATE FUNCTION strip_spaces(@str varchar(8000))
RETURNS varchar(8000) AS
BEGIN 
    WHILE CHARINDEX('  ', @str) > 0 
        SET @str = REPLACE(@str, '  ', ' ')

    RETURN @str
END

Alors, il suffit de faire

SELECT dbo.strip_spaces(myText) FROM myTable

6voto

JohnFx Points 23761

C'est un peu de la force brute, mais ça marchera

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

6voto

HLGEM Points 54641
update mytable
set myfield = replace (myfield, '  ',  ' ')
where charindex('  ', myfield) > 0 

Le remplacement fonctionnera sur tous les espaces doubles, il n'est pas nécessaire de mettre plusieurs remplacements. C'est la solution basée sur les ensembles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X