Eliminar todos los espacios de una cadena en SQL Server


222

¿Cuál es la mejor manera de eliminar todos los espacios de una cadena en SQL Server 2008?

LTRIM(RTRIM(' a b ')) eliminaría todos los espacios a la derecha e izquierda de la cadena, pero también necesito eliminar el espacio en el medio.


55
Por "todos los espacios en blanco", ¿quiere decir solo espacios regulares? O, ¿te refieres a pestañas, CR, LF y otros caracteres que pueden aparecer como espacios en blanco?
Gordon Linoff

3
@GordonLinoff: quise decir espacios regulares
Ananth

Respuestas:


385

Simplemente reemplácelo;

SELECT REPLACE(fld_or_variable, ' ', '')

Editar: solo para aclarar; es un reemplazo global, no hay necesidad trim()o preocupación por múltiples espacios para charo varchar:

create table #t (
    c char(8),
    v varchar(8))

insert #t (c, v) values 
    ('a a'    , 'a a'    ),
    ('a a  '  , 'a a  '  ),
    ('  a a'  , '  a a'  ),
    ('  a a  ', '  a a  ')

select
    '"' + c + '"' [IN], '"' + replace(c, ' ', '') + '"' [OUT]
from #t  
union all select
    '"' + v + '"', '"' + replace(v, ' ', '') + '"'
from #t 

Resultado

IN             OUT
===================
"a a     "     "aa"
"a a     "     "aa"
"  a a   "     "aa"
"  a a   "     "aa"
"a a"          "aa"
"a a  "        "aa"
"  a a"        "aa"
"  a a  "      "aa"

2
¿Qué pasa si hay múltiples espacios en blanco entre las palabras? REEMPLAZAR solo elimina uno a la vez. Se debe escribir una función definida por el usuario que elimine múltiples espacios.
Farhan

Esto no parece reemplazar los espacios en blanco finales
Ryan Sampson

77
Se debe reemplazar todos los espacios en blanco en todas partes
Alex K.

ELIMINARÁ todos los espacios en blanco excepto el final. Para eliminar el final, agregue TRIM (REPLACE (fld_or_variable, '', '')). La razón por la que elimina incluso múltiples espacios es porque ... bueno, cambia los caracteres de cada espacio a nada, ya sea que los espacios estén uno al lado del otro o no.
snaplemouton

32
Reemplazar elimina todos los espacios, incluso detrás de uno. Si todavía hay espacios de aprendizaje en los datos después de esto, es probable que no sean espacios sino caracteres no imprimibles como tabulaciones o retornos de carraige.
HLGEM


28

Si se trata de una actualización en una tabla, todo lo que tiene que hacer es ejecutar esta actualización varias veces hasta que afecte a 0 filas.

update tableName
set colName = REPLACE(LTRIM(RTRIM(colName)), '  ', ' ')
where colName like '%  %'


11

Referencia tomada de este blog:

Primero, cree una tabla de muestra y datos:

CREATE TABLE tbl_RemoveExtraSpaces
(
     Rno INT
     ,Name VARCHAR(100)
)
GO

INSERT INTO tbl_RemoveExtraSpaces VALUES (1,'I    am     Anvesh   Patel')
INSERT INTO tbl_RemoveExtraSpaces VALUES (2,'Database   Research and     Development  ')
INSERT INTO tbl_RemoveExtraSpaces VALUES (3,'Database    Administrator     ')
INSERT INTO tbl_RemoveExtraSpaces VALUES (4,'Learning    BIGDATA    and       NOSQL ')
GO

Script para SELECCIONAR cadena sin espacios adicionales:

SELECT
     [Rno]
    ,[Name] AS StringWithSpace
    ,LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([Name],CHAR(32),'()'),')(',''),'()',CHAR(32)))) AS StringWithoutSpace
FROM tbl_RemoveExtraSpaces

Resultado:

Rno         StringWithSpace                                 StringWithoutSpace
----------- -----------------------------------------  ---------------------------------------------
1           I    am     Anvesh   Patel                      I am Anvesh Patel
2           Database   Research and     Development         Database Research and Development
3           Database    Administrator                       Database Administrator
4           Learning    BIGDATA    and       NOSQL          Learning BIGDATA and NOSQL

2
¿Te das cuenta de que el OP quería eliminar TODOS los espacios en lugar de reemplazar múltiples espacios con uno solo?
Kaii

3
Esto debería haber sido rechazado debido a que la respuesta no es la requerida por el OP, sino que recibió 4 votos positivos. Bienvenido a Stack Overflow.
Mr.J

@ Mr.J y ahora tiene 9. Mundo loco.
Leszek P

11

100% de trabajo

UPDATE table_name SET  "column_name"=replace("column_name", ' ', ''); //Remove white space

UPDATE table_name SET  "column_name"=replace("column_name", '\n', ''); //Remove newline

UPDATE table_name SET  "column_name"=replace("column_name", '\t', ''); //Remove all tab

Puedes usar "column_name"ocolumn_name

Gracias

Subroto


2
Tuve que usar select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')para eliminar todas las líneas nuevas y espacios de una varcharcolumna. Si usé '\ n' y '\ r' en lugar de char (13) y char (10) no funcionó.
Ene

para ejecutar esto, es necesario ejecutar "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

Si hay varios espacios en blanco en una cadena, reemplazar puede no funcionar correctamente. Para eso, se debe utilizar la siguiente función.

CREATE FUNCTION RemoveAllSpaces
(
    @InputStr varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @InputStr
while charindex(' ', @ResultStr) > 0
    set @ResultStr = replace(@InputStr, ' ', '')

return @ResultStr
END

Ejemplo:

select dbo.RemoveAllSpaces('aa  aaa       aa aa                 a')

Salida:

aaaaaaaaaa

1
"@InputStr" debería ser "@ResultStr" en el cuerpo del bucle while.
jjoelson

@jjoelson, ¿te importaría crear esta función y probarla antes de señalar errores?
Farhan

77
Lo siento, estaba trabajando bajo su suposición anterior de que REPLACE solo elimina uno a la vez, en cuyo caso esta función causaría un bucle infinito para entradas con múltiples espacios. En realidad, el ciclo while ni siquiera es necesario en absoluto.
jjoelson

2
Farhan, si REPLACE funcionó como crees que funciona, entonces el primer comentario de @jjoelson es correcto. De lo contrario, tendrá un bucle infinito porque InputStr nunca cambia, por lo que ResultStr siempre será el primer resultado de REPLACE. La razón por la que su código funciona es porque REPLACE se necesita solo 1 vez. Nunca se llama por segunda vez, no importa qué cuerda le lances. Agregue un contador e imprímalo con cada iteración. Siempre será 1. REPLACE (InputStr, '', '') eliminará todos los espacios con una llamada.
Gilbert

6

Esto hace el truco de eliminar los espacios en las cadenas:

UPDATE
    tablename
SET
    columnname = replace(columnname, ' ', '');

2

En caso de que necesite RECORTAR espacios en todas las columnas, puede usar este script para hacerlo dinámicamente:

--Just change table name
declare @MyTable varchar(100)
set @MyTable = 'MyTable'

--temp table to get column names and a row id
select column_name, ROW_NUMBER() OVER(ORDER BY column_name) as id into #tempcols from INFORMATION_SCHEMA.COLUMNS 
WHERE   DATA_TYPE IN ('varchar', 'nvarchar') and TABLE_NAME = @MyTable

declare @tri int
select @tri = count(*) from #tempcols
declare @i int
select @i = 0
declare @trimmer nvarchar(max)
declare @comma varchar(1)
set @comma = ', '

--Build Update query
select @trimmer = 'UPDATE [dbo].[' + @MyTable + '] SET '

WHILE @i <= @tri 
BEGIN

    IF (@i = @tri)
        BEGIN
        set @comma = ''
        END
    SELECT  @trimmer = @trimmer + CHAR(10)+ '[' + COLUMN_NAME + '] = LTRIM(RTRIM([' + COLUMN_NAME + ']))'+@comma
    FROM    #tempcols
    where id = @i

    select @i = @i+1
END

--execute the entire query
EXEC sp_executesql @trimmer

drop table #tempcols

2

si desea eliminar espacios, - y otro texto de la cadena, use lo siguiente:

supongamos que tiene un número de teléfono móvil en su tabla como '718-378-4957' o '7183784957' y desea reemplazar y obtener el número de teléfono móvil y luego usar el siguiente texto.

select replace(replace(replace(replace(MobileNo,'-',''),'(',''),')',''),' ','') from EmployeeContactNumber

Resultado: - 7183784957


2

Solo un consejo, en caso de que tenga problemas con la función de reemplazo, es posible que tenga el tipo de datos establecido en nchar (en cuyo caso es una longitud fija y no funcionará).


2

Para completar todas las respuestas anteriores, hay publicaciones adicionales en StackOverflow sobre cómo lidiar con TODOS los caracteres de espacios en blanco (consulte https://en.wikipedia.org/wiki/Whitespace_character para obtener una lista completa de estos caracteres):



2

Esto es útil para mí:

CREATE FUNCTION dbo.TRIM(@String VARCHAR(MAX))
RETURNS VARCHAR(MAX)
BEGIN
    RETURN LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@String,CHAR(10),'[]'),CHAR(13),'[]'),char(9),'[]'),CHAR(32),'[]'),'][',''),'[]',CHAR(32))));
END
GO

.


1

Tuve este problema hoy y reemplazar / recortar hizo el truco ... ver a continuación.

update table_foo 
set column_bar  = REPLACE(LTRIM(RTRIM(column_bar)), '  ', '')

antes y después de :

old-bad:  column_bar    |   New-fixed:   column_bar
       '  xyz  '        |                'xyz'   
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 

1
¿Por qué molestarse con el LTRIM& RTRIM?
BanksySan

Frio. ¿Tienes el ejemplo?
BanksySan

0

Para eliminar los espacios en una cadena izquierda y derecha. Para quitar espacio en el medio de uso Replace.

Puede usar RTRIM()para eliminar espacios de la derecha y LTRIM()para eliminar espacios de la izquierda, por lo tanto, los espacios izquierdo y derecho se eliminan de la siguiente manera:

SELECT * FROM table WHERE LTRIM(RTRIM(username)) = LTRIM(RTRIM("Bob alias baby"))

0

Sintaxis para reemplazar caracteres específicos:

REPLACE ( string_expression , string_pattern , string_replacement )  

Por ejemplo, en la cadena "HelloReplaceThingsGoing" Reemplazar palabra se reemplaza por Cómo

SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO

0

Una versión funcional (udf) que elimina espacios, cr, lf, tabuladores o configurables.

select Common.ufn_RemoveWhitespace(' 234   asdf   wefwef 3  x   ', default) as S

Resultado: '234asdfwefwef3x'

alter function Common.RemoveWhitespace
(
    @pString nvarchar(max),
    @pWhitespaceCharsOpt nvarchar(max) = null -- default: tab, lf, cr, space 
)  
returns nvarchar(max) as
/*--------------------------------------------------------------------------------------------------
    Purpose:   Compress whitespace

    Example:  select Common.ufn_RemoveWhitespace(' 234   asdf   wefwef 3  x   ', default) as s 
              -- Result: 234asdfwefwef3x

    Modified    By          Description
    ----------  ----------- --------------------------------------------------------------------
    2018.07.24  crokusek    Initial Version 
  --------------------------------------------------------------------------------------------------*/ 
begin    
    declare 
        @maxLen bigint = 1073741823, -- (2^31 - 1) / 2 (https://stackoverflow.com/a/4270085/538763)
        @whitespaceChars nvarchar(30) = coalesce(
            @pWhitespaceCharsOpt, 
            char(9) + char(10) + char(13) + char(32));  -- tab, lf, cr, space

    declare
        @whitespacePattern nvarchar(30) = '%[' + @whitespaceChars + ']%',
        @nonWhitespacePattern nvarchar(30) = '%[^' + @whitespaceChars + ']%',
        @previousString nvarchar(max) = '';

    while (@pString != @previousString)
    begin
        set @previousString = @pString;

        declare
            @whiteIndex int = patindex(@whitespacePattern, @pString);

        if (@whiteIndex > 0)
        begin                   
            declare 
                @whitespaceLength int = nullif(patindex(@nonWhitespacePattern, substring(@pString, @whiteIndex, @maxLen)), 0) - 1;                

            set @pString = 
                substring(@pString, 1, @whiteIndex - 1) + 
                iif(@whiteSpaceLength > 0, substring(@pString, @whiteIndex + @whiteSpaceLength, @maxLen), '');
        end        
    end        
    return @pString;
end
go

0

Por alguna razón, el reemplazo funciona solo con una cadena cada vez. Tenía una cadena como esta " Test MSP " y quiero dejar solo un espacio.

Utilicé el enfoque que hizo @Farhan, pero con algunas modificaciones:

CREATE FUNCTION ReplaceAll
(
    @OriginalString varchar(8000),
    @StringToRemove varchar(20),
    @StringToPutInPlace varchar(20)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @OriginalString
while charindex(@StringToRemove, @ResultStr) > 0
    set @ResultStr = replace(@ResultStr, @StringToRemove, @StringToPutInPlace)

return @ResultStr
END

Luego ejecuto mi actualización así

UPDATE tbTest SET Description = dbo.ReplaceAll(Description, '  ', ' ') WHERE ID = 14225

Entonces obtuve este resultado: Prueba MSP

Publicando aquí si en caso de que alguien lo necesite como yo lo hice.

Ejecutando en: Microsoft SQL Server 2016 (SP2)


0

Verifique y pruebe el siguiente script (Unidad probada):

--Declaring
DECLARE @Tbl TABLE(col_1 VARCHAR(100));

--Test Samples
INSERT INTO @Tbl (col_1)
VALUES
('  EY     y            
Salem')
, ('  EY     P    ort       Chennai   ')
, ('  EY     Old           Park   ')
, ('  EY   ')
, ('  EY   ')
,(''),(null),('d                           
    f');

SELECT col_1 AS INPUT,
    LTRIM(RTRIM(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(col_1,CHAR(10),' ')
        ,CHAR(11),' ')
        ,CHAR(12),' ')
        ,CHAR(13),' ')
        ,CHAR(14),' ')
        ,CHAR(160),' ')
        ,CHAR(13)+CHAR(10),' ')
    ,CHAR(9),' ')
    ,' ',CHAR(17)+CHAR(18))
    ,CHAR(18)+CHAR(17),'')
    ,CHAR(17)+CHAR(18),' ')
    )) AS [OUTPUT]
FROM @Tbl;

-1

Parece que todos siguen refiriéndose a una sola función REPLACE. O incluso muchas llamadas de una función REPLACE. Pero cuando tiene una salida dinámica con un número desconocido de espacios, no funcionará. Cualquiera que se ocupe de este problema regularmente sabe que REPLACE solo eliminará un espacio, NO TODOS, como debería. Y LTRIM y RTRIM parecen tener el mismo problema. Déjalo en manos de Microsoft. Aquí hay una salida de muestra que utiliza un bucle WHILE para eliminar TODOS los valores CHAR (32) (espacio).

DECLARE @INPUT_VAL  VARCHAR(8000)
DECLARE @OUTPUT_VAL VARCHAR(8000)

SET @INPUT_VAL = '      C               A                         '
SET @OUTPUT_VAL = @INPUT_VAL
WHILE CHARINDEX(CHAR(32), @OUTPUT_VAL) > 0 BEGIN
    SET @OUTPUT_VAL = REPLACE(@INPUT_VAL, CHAR(32), '')
END

PRINT 'START:' + @INPUT_VAL + ':END'
PRINT 'START:' + @OUTPUT_VAL + ':END'

Aquí está la salida del código anterior:

START:      C               A                         :END
START:CA:END

Ahora, para ir un paso más allá y utilizarlo en una instrucción UPDATE o SELECT, cámbielo a udf.

CREATE FUNCTION udf_RemoveSpaces (@INPUT_VAL    VARCHAR(8000))
RETURNS VARCHAR(8000)
AS 
BEGIN

DECLARE @OUTPUT_VAL VARCHAR(8000)
SET @OUTPUT_VAL = @INPUT_VAL
-- ITTERATE THROUGH STRING TO LOOK FOR THE ASCII VALUE OF SPACE (CHAR(32)) REPLACE IT WITH BLANK, NOT NULL
WHILE CHARINDEX(CHAR(32), @OUTPUT_VAL) > 0 BEGIN
    SET @OUTPUT_VAL = REPLACE(@INPUT_VAL, CHAR(32), '')
END

RETURN @OUTPUT_VAL
END

Luego utilice la función en una instrucción SELECT o INSERT:

UPDATE A
SET STATUS_REASON_CODE = WHATEVER.dbo.udf_RemoveSpaces(STATUS_REASON_CODE)
FROM WHATEVER..ACCT_INFO A
WHERE A.SOMEVALUE = @SOMEVALUE

INSERT INTO SOMETABLE
(STATUS_REASON_CODE)
SELECT WHATEVER.dbo.udf_RemoveSpaces(STATUS_REASON_CODE)
FROM WHATEVER..ACCT_INFO A
WHERE A.SOMEVALUE = @SOMEVALUE

1
"REPLACE solo eliminará un espacio". ...¿De Verdad? Esta demostración simple sugiere que no: dbfiddle.uk/… . ¿Tienes un ejemplo de dónde eso no funcionaría?
ADyson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.