2010-02-02 25 views

Respuesta

26

Aquí hay una forma sencilla basada en conjuntos que colapsará múltiples espacios en un solo espacio mediante la aplicación de tres reemplazos.

DECLARE @myTable TABLE (myTextColumn VARCHAR(50)) 

INSERT INTO @myTable VALUES ('0Space') 
INSERT INTO @myTable VALUES (' 1 Spaces 1 Spaces. ') 
INSERT INTO @myTable VALUES (' 2 Spaces 2 Spaces. ') 
INSERT INTO @myTable VALUES (' 3 Spaces 3 Spaces. ') 
INSERT INTO @myTable VALUES (' 4 Spaces 4 Spaces. ') 
INSERT INTO @myTable VALUES ('  5  Spaces 5  Spaces.  ') 
INSERT INTO @myTable VALUES ('  6  Spaces 6  Spaces.  ') 

select replace(
      replace(
      replace(
       LTrim(RTrim(myTextColumn)), ---Trim the field 
      ' ',' |'),     ---Mark double spaces 
      '| ',''),       ---Delete double spaces offset by 1 
     '|','')        ---Tidy up 
     AS SingleSpaceTextColumn 
from @myTable 

Su estado de actualización ahora se puede establecer en base:

update @myTable 
    set myTextColumn = replace(
          replace(
          replace(
           LTrim(RTrim(myTextColumn)), 
          ' ',' |'), 
          '| ',''), 
         '|','') 

utilizar un cláusula WHERE apropiada para limitar la actualización únicamente a las filas que se necesita actualizar o tal vez tener espacios dobles.

Ejemplo:

where 1<=Patindex('% %', myTextColumn) 

he encontrado una escritura externa sobre este método: REPLACE Multiple Spaces with One

+0

Creo que esto es lo mismo que la respuesta de Pablo, pero sus comentarios lo hacen un poco más legible – cindi

+1

Bien visto que son del mismo método. – Andrew

+0

Referencia externa aclarado cosas – cindi

2

paso a través de los caracteres de uno en uno, y mantener un registro de el personaje anterior. Si el carácter actual es un espacio, y el último carácter es un espacio, stuff.

CREATE FUNCTION [dbo].[fnRemoveExtraSpaces] (@Number AS varchar(1000)) 
Returns Varchar(1000) 
As 
Begin 
Declare @n int -- Length of counter 
Declare @old char(1) 

Set @n = 1 
--Begin Loop of field value 
While @n <=Len (@Number) 
    BEGIN 
    If Substring(@Number, @n, 1) = ' ' AND @old = ' ' 
     BEGIN 
     Select @Number = Stuff(@Number , @n , 1 , '') 
     END 
    Else 
     BEGIN 
     SET @old = Substring(@Number, @n, 1) 
     Set @n = @n + 1 
     END 
    END 
Return @number 
END 
GO 


select [dbo].[fnRemoveExtraSpaces]('xxx  xxx  xxx xxx') 
0
create table blank(
field_blank char(100)) 

insert into blank values('yyy  yyyy') 
insert into blank values('xxxx xxxx') 
insert into blank values ('xxx xxx') 
insert into blank values ('zzzzzz zzzzz') 

update blank 
set field_blank = substring(field_blank,1,charindex(' ',field_blank)-1) + ' ' + ltrim(substring(field_blank,charindex(' ',field_blank) + 1,len(field_blank))) 
where CHARINDEX (' ' , rtrim(field_blank)) > 1 

select * from blank 
+2

no funciona en múltiples ocurrencias de espacios excesivos. – cjk

+0

@ck: estoy interesado en ver loop en sql. ¿Puedes publicar como actualización tu respuesta? tia. – Saar

3

No muy encomendadas a partir de un simple pero WHILE que hacer el truco.

CREATE TABLE #myTable (myTextColumn VARCHAR(32)) 

INSERT INTO #myTable VALUES ('NoSpace') 
INSERT INTO #myTable VALUES ('One Space') 
INSERT INTO #myTable VALUES ('Two Spaces') 
INSERT INTO #myTable VALUES ('Multiple Spaces .') 

WHILE EXISTS (SELECT * FROM #myTable WHERE myTextColumn LIKE '% %') 
    UPDATE #myTable 
    SET  myTextColumn = REPLACE(myTextColumn, ' ', ' ') 
    WHERE myTextColumn LIKE '% %' 

SELECT * FROM #myTable 

DROP TABLE #myTable 
+0

Por supuesto, esto no funcionará en SQL Server 2000 debido a la cláusula 'OUTPUT', pero es una buena respuesta. – Codesleuth

+0

@Codesleuth - gracias, me perdí ese requisito. La respuesta se ha actualizado para que funcione con SQL Server 2000. –

+0

aww, pero ¿la cambiaste a una tabla temporal? Eso me pone triste, las tablas declaradas también funcionan en el año 2000, ¿sabes? – Codesleuth

28

Esto funciona:

UPDATE myTable 
SET myTextColumn = 
    REPLACE(
     REPLACE(
      REPLACE(myTextColumn 
       ,' ',' '+CHAR(1)) -- CHAR(1) is unlikely to appear 
     ,CHAR(1)+' ','') 
    ,CHAR(1),'') 
WHERE myTextColumn LIKE '% %' 

totalmente basado en conjunto; sin bucles

Reemplazamos dos espacios con un carácter inusual y un espacio. Si llamamos al carácter inusual X, se convierten 5 espacios: 'X X' y 6 espacios se convierten en 'X X X'. Luego reemplazamos 'X' con la cadena vacía. Entonces 5 espacios se convierten en '' y 6 espacios se convierten en 'X'. Luego, en caso de que hubiera un número par de espacios, eliminamos cualquier 'X' restante, dejando un espacio simple.

+0

Técnicamente 'REPLACE' recorrerá el texto ... – cjk

+0

Técnicamente, cierto. Pero técnicamente casi cualquier SQL implicará un ciclo. Debería haber dicho que usa una sola consulta. – Paul

+0

Hábilmente evita dar vueltas alrededor de la mesa. Me pregunto si podría hacerse más legible aunque – cindi

3
SELECT 'starting...' --sets @@rowcount 
WHILE @@rowcount <> 0 
    update myTable 
    set myTextColumn = replace(myTextColumn, ' ', ' ') 
    where myTextColumn like '% %' 
+1

Cheeky, pero no particularmente eficiente ... – cjk

+0

Prefiero "Elegante y simple" ... – gbn

+0

Usar rowcount con la cláusula where fue una buena idea – cindi

-2
Update myTable set myTextColumn = replace(myTextColumn, ' ', ' '); 

La consulta anterior eliminará todos los espacios en blanco con doble espacio en blanco sencillo

Pero esto funcionaría sólo una vez.

+0

donde mi loop .... – cindi

+0

@cjk se menciona claramente en la respuesta, funcionaría solo una vez – Ravia

+0

Y se menciona claramente en la pregunta que el OP quiere reemplazar espacios REPETIDOS con un solo espacio. El ejemplo en la pregunta incluso tiene el SQL que ha publicado como respuesta, y tiene un bucle (WHILE) para realizar el reemplazo doble a único en varias ocasiones. Por cierto, NO voté. –

0

Para mí los ejemplos anteriores casi hicieron un truco pero necesitaba algo que era más estable e independiente de la tabla o columna o un número establecido de iteraciones. Esta es mi modificación de la mayoría de las consultas anteriores.

CREATE FUNCTION udfReplaceAll 
(
    @OriginalText NVARCHAR(MAX), 
    @OldText NVARCHAR(MAX), 
    @NewText NVARCHAR(MAX) 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    WHILE (@OriginalText LIKE '%' + @OldText + '%') 
    BEGIN 
     SET @OriginalText = REPLACE(@OriginalText,@OldText,@NewText) 
    END 

    RETURN @OriginalText 
END 
GO 
0

permite decir, los datos de este tipo

Table name : userdata Field: id, comment, status, 

id, "I love -- -- - -spaces -- - my INDIA" , "Active" <br> 
id, "I love -- -- - -spaces -- - my INDIA" , "Active" <br> 
id, "I love -- -- - -spaces -- - my INDIA" , "Active" <br> 
id, "I love -- -- - -spaces -- - my INDIA" , "Active" <br> 

Así que hacer como esto

update userdata set comment=REPLACE(REPLACE(comment," ","-SPACEHERE-"),"-SPACEHERE"," "); 

Yo no probé, pero creo esto funcionará

0

Aquí es una solución más simple :)

update myTable 
    set myTextColumn = replace(replace(replace(LTrim(RTrim(myTextColumn)),' ','<>'),'><',''),'<>',' ') 
0

Prueba esto:

UPDATE Ships 
SET name = REPLACE(REPLACE(REPLACE(name, ' ', ' ' + CHAR(1)), CHAR(1) + ' ', ''), CHAR(1), '') 
WHERE name LIKE '% %' 
Cuestiones relacionadas