Rimuovere tutti gli spazi da una stringa in SQL Server


222

Qual è il modo migliore per rimuovere tutti gli spazi da una stringa in SQL Server 2008?

LTRIM(RTRIM(' a b ')) rimuoverebbe tutti gli spazi a destra e a sinistra della stringa, ma devo anche rimuovere lo spazio nel mezzo.


5
Per "tutti gli spazi bianchi" intendi solo spazi regolari? Oppure intendi le schede, CR, LF e altri caratteri che possono essere visualizzati come spazi bianchi?
Gordon Linoff,

3
@GordonLinoff: intendevo spazi regolari
Ananth,

Risposte:


385

Sostituiscilo semplicemente;

SELECT REPLACE(fld_or_variable, ' ', '')

Modifica: solo per chiarire; è un sostituto globale, non è necessario trim()o preoccuparsi di più spazi per uno 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 

Risultato

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
Cosa succede se ci sono più spazi bianchi tra le parole? SOSTITUIRE rimuove solo uno alla volta. Dovrebbe essere scritta una funzione definita dall'utente che rimuove più spazi.
Farhan,

Questo non sembra sostituire gli spazi bianchi finali
Ryan Sampson

7
Dovrebbe sostituire tutti gli spazi bianchi ovunque
Alex K.

Rimuoverà tutti gli spazi bianchi ad eccezione del trascinamento. Per rimuovere il trailing aggiungere TRIM (REPLACE (fld_or_variable, '', '')). Il motivo per cui rimuove anche più spazi è perché ... beh, cambia tutti i caratteri dello spazio in nulla, indipendentemente dal fatto che gli spazi siano vicini o meno.
snaplemouton,

32
Sostituisci rimuove tutti gli spazi anche dopo uno. Se dopo aver fatto ciò ci sono ancora spazi apprendistati nei dati, è probabile che non siano spazi ma caratteri non stampabili come tabulazioni o ritorni a capo.
HLGEM,


28

Se si tratta di un aggiornamento su una tabella, è sufficiente eseguire questo aggiornamento più volte fino a quando non ha effetto su 0 righe.

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


11

Riferimento tratto da questo blog:

Innanzitutto, crea una tabella di esempio e dati:

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 per SELEZIONARE la stringa senza spazi extra:

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

Risultato:

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
Ti rendi conto che l'OP ha voluto rimuovere TUTTI gli spazi invece di sostituire più spazi con uno singolo?
Kaii

3
Questo avrebbe dovuto essere ridimensionato a causa della risposta non richiesta dall'OP, ma invece ha ottenuto 4 voti. Benvenuto in Stack Overflow.
Mr.J

@ Mr.J e ora ha 9. Mondo pazzo.
Leszek P

11

100% funzionante

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

Puoi usare "column_name"ocolumn_name

Grazie

Subroto


2
Ho dovuto usare select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')per rimuovere tutte le newline e gli spazi da una varcharcolonna. Se avessi usato '\ n' e '\ r' invece di char (13) e char (10) non funzionava.
Jan

per eseguire ciò, è necessario eseguire "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein,


6

Se ci sono più spazi bianchi in una stringa, allora sostituire potrebbe non funzionare correttamente. Per questo, dovrebbe essere usata la seguente funzione.

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

Esempio:

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

Produzione:

aaaaaaaaaa

1
"@InputStr" dovrebbe essere "@ResultStr" nel corpo del ciclo while.
giovedì

@jjoelson ti dispiacerebbe creare questa funzione e testarla prima di segnalare errori?
Farhan,

7
Siamo spiacenti, stavo lavorando sul presupposto di cui sopra che REPLACE ne rimuove solo uno alla volta, nel qual caso questa funzione causerebbe un ciclo infinito per input con spazi multipli. In realtà, il ciclo while non è nemmeno necessario.
giovedì

2
Farhan, se REPLACE ha funzionato nel modo in cui pensi che funzioni, allora il primo commento di @jjoelson è corretto. Altrimenti avrai un ciclo infinito perché InputStr non cambia mai, quindi ResultStr sarà sempre il primo risultato SOSTITUISCI. Il motivo per cui il codice funziona è perché REPLACE è necessario solo 1 volta. Non viene mai chiamato una seconda volta, non importa quale stringa gli lanci. Aggiungi un contatore e stampalo con ogni iterazione. Sarà sempre 1. REPLACE (InputStr, '', '') rimuoverà ogni spazio con una chiamata.
Gilbert,

6

Questo fa il trucco di rimuovere gli spazi sulle stringhe:

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

2

Nel caso in cui sia necessario TRIM spazi in tutte le colonne, è possibile utilizzare questo script per farlo in modo dinamico:

--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

se si desidera rimuovere spazi, - e un altro testo dalla stringa, utilizzare quanto segue:

supponiamo di avere un numero di cellulare nella tua tabella come '718-378-4957' o '7183784957' e desideri sostituirlo e ottenere il numero di cellulare, quindi usa il seguente testo.

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

Risultato: - 7183784957


2

Solo un suggerimento, in caso di problemi con la funzione di sostituzione, è possibile che il tipo di dati sia impostato su nchar (nel qual caso è una lunghezza fissa e non funzionerà).


2


2

questo è utile per me:

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

Ho avuto questo problema oggi e sostituire / tagliare ha fatto il trucco .. vedi sotto.

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

prima e dopo :

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

1
Perché preoccuparsi di LTRIM& RTRIM?
BanksySan,

Freddo. Hai l'esempio?
BanksySan,

0

Per rimuovere gli spazi in una stringa sinistra e destra. Per rimuovere lo spazio in mezzo uso Replace.

È possibile utilizzare RTRIM()per rimuovere gli spazi da destra e LTRIM()per rimuovere gli spazi da sinistra, quindi gli spazi sinistro e destro rimossi come segue:

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

0

Sintassi per la sostituzione di caratteri specifici:

REPLACE ( string_expression , string_pattern , string_replacement )  

Ad esempio nella stringa "HelloReplaceThingsGoing" Sostituisci la parola è sostituita da How

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

0

Una versione funzionale (udf) che rimuove spazi, cr, lf, tab o configurabile.

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

Risultato: '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

Per qualche ragione, il sostituto funziona solo con una stringa ogni volta. Avevo una stringa come questa " Test MSP " e voglio lasciare solo uno spazio.

Ho usato l'approccio di @Farhan, ma con alcune modifiche:

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

Quindi eseguo il mio aggiornamento in questo modo

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

Quindi ho ottenuto questo risultato: prova MSP

Pubblicare qui se nel caso qualcuno ne avesse bisogno come me.

In esecuzione su: Microsoft SQL Server 2016 (SP2)


0

Controlla e prova lo script seguente (Unit Tested) -

--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

Sembra che tutti continuino a riferirsi a una singola funzione REPLACE. O anche molte chiamate di una funzione REPLACE. Ma quando hai un output dinamico con un numero sconosciuto di spazi, non funzionerà. Chiunque affronti questo problema su base regolare sa che REPLACE rimuoverà solo un singolo spazio, NON TUTTO, come dovrebbe. E LTRIM e RTRIM sembrano avere lo stesso problema. Lascia a Microsoft. Ecco un output di esempio che utilizza un ciclo WHILE per rimuovere i valori ALL (32) (spazio).

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'

Ecco l'output del codice sopra:

START:      C               A                         :END
START:CA:END

Ora per fare un ulteriore passo avanti e utilizzarlo in un'istruzione UPDATE o SELECT, modificalo in 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

Quindi utilizzare la funzione in un'istruzione 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 rimuoverà solo un singolo spazio." ...veramente? Questa semplice demo suggerisce di non: dbfiddle.uk/… . Hai un esempio di dove non funzionerebbe?
ADyson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.