Remova todos os espaços de uma seqüência de caracteres no SQL Server


222

Qual é a melhor maneira de remover todos os espaços de uma seqüência de caracteres no SQL Server 2008?

LTRIM(RTRIM(' a b ')) removeria todos os espaços à direita e à esquerda da string, mas também preciso remover o espaço no meio.


5
Por "todos os espaços em branco", você quer dizer apenas espaços regulares? Ou você quer dizer tabulações, CR, LF e outros caracteres que podem ser exibidos como espaço em branco?
Gordon Linoff

3
@GordonLinoff: Eu quis dizer espaços regulares
Ananth

Respostas:


385

Simplesmente substitua-o;

SELECT REPLACE(fld_or_variable, ' ', '')

Editar: Apenas para esclarecer; é uma substituição global, não há necessidade trim()ou preocupação com vários espaços para um charou 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
E se houver vários espaços em branco entre as palavras? REPLACE remove apenas um de cada vez. Uma função definida pelo usuário deve ser escrita, o que remove vários espaços.
Farhan

Isso não parece para substituir espaços à direita brancas
Ryan Sampson

7
Ele deve substituir todos os espaços em todos os lugares
Alex K.

Ele removerá todos os espaços em branco, exceto a direita. Para remover à direita, adicione TRIM (REPLACE (fld_or_variable, '', '')). A razão pela qual remove até vários espaços é porque ... bem, muda todos os caracteres de espaço para nada, se os espaços estão próximos um do outro ou não.
precisa saber é o seguinte

32
Substituir remove todos os espaços, mesmo após um. Se ainda houver espaços apropriadamente nos dados depois que isso for feito, é provável que não sejam espaços, mas caracteres não imprimíveis, como tabulações ou retornos automáticos.
HLGEM


28

Se for uma atualização em uma tabela, tudo o que você precisa fazer é executar essa atualização várias vezes até afetar 0 linhas.

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


11

Referência retirada deste blog:

Primeiro, crie tabela e dados de amostra:

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 SELECT string sem espaços extras:

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
Você percebe que o OP queria remover TODOS os espaços em vez de substituir vários espaços por um único?
Kaii

3
Isso deveria ter sido diminuído porque a resposta não é tão exigida pelo OP, mas obteve 4 votos positivos. Bem-vindo ao Stack Overflow.
Mr.J

@ Mr.J e agora tem 9. Mundo louco.
precisa

11

100% trabalhando

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

Você pode usar "column_name"oucolumn_name

obrigado

Subroto


2
Eu tive que usar select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')para remover todas as novas linhas e espaços de uma varcharcoluna. Se eu usasse '\ n' e '\ r' em vez de char (13) e char (10), não funcionaria.
Jan

para executar isso, é necessário executar "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

Se houver vários espaços em branco em uma sequência, a substituição poderá não funcionar corretamente. Para isso, a seguinte função deve ser usada.

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

Exemplo:

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

Resultado:

aaaaaaaaaa

1
"@InputStr" deve ser "@ResultStr" no corpo do loop while.
jjoelson

@jjoelson você se importaria de criar essa função e testá-la antes de apontar erros?
precisa

7
Desculpe, eu estava trabalhando com a suposição acima de que REPLACE remove apenas um de cada vez; nesse caso, essa função causaria um loop infinito para entradas com vários espaços. Na realidade, o loop while nem sequer é necessário.
jjoelson

2
Farhan, se REPLACE funcionou da maneira que você pensa, então o primeiro comentário de @jjoelson está correto. Caso contrário, você terá um loop infinito, porque InputStr nunca muda, portanto ResultStr sempre será o primeiro resultado REPLACE. A razão pela qual seu código funciona é porque REPLACE é necessário apenas 1 vez. Nunca é chamado uma segunda vez, não importa que corda você jogue nele. Adicione um contador e imprima-o a cada iteração. Sempre será 1. REPLACE (InputStr, '', '') removerá todos os espaços com uma chamada.
Gilbert

6

Isso faz o truque de remover os espaços nas seqüências de caracteres:

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

2

Caso você precise TRIM espaços em todas as colunas, você pode usar este script para fazê-lo dinamicamente:

--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 você deseja remover espaços, - e outro texto da string, use o seguinte:

suponha que você tenha um número de celular em sua tabela como '718-378-4957' ou '7183784957' e deseje substituir e obter o número de celular e use o texto a seguir.

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

Resultado: - 7183784957


2

Apenas uma dica: no caso de você estar tendo problemas com a função de substituição, o tipo de dados pode estar definido como nchar (nesse caso, é um comprimento fixo e não funcionará).


2

Para completar todas as respostas acima, existem postagens adicionais no StackOverflow sobre como lidar com TODOS os caracteres de espaço em branco (consulte https://en.wikipedia.org/wiki/Whitespace_character para obter uma lista completa desses caracteres):



2

isso é útil para mim:

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

Eu tive esse problema hoje e substituir / aparar fez o truque ... veja abaixo.

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

antes e depois :

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

1
Por que se preocupar com o LTRIM& RTRIM?
precisa saber é o seguinte

Legal. Você tem o exemplo?
BanksySan

0

Para remover os espaços em uma string esquerda e direita. Para remover o espaço em uso intermediário Replace.

Você pode usar RTRIM()para remover espaços da direita e LTRIM()para remover espaços da esquerda e, portanto, os espaços esquerdo e direito removidos da seguinte maneira:

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

0

Sintaxe para substituir caracteres específicos:

REPLACE ( string_expression , string_pattern , string_replacement )  

Por exemplo, na cadeia "HelloReplaceThingsGoing" Substituir palavra é substituída por Como

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

0

Uma versão funcional (udf) que remove espaços, cr, lf, tabs ou configuráveis.

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 algum motivo, a substituição funciona apenas com uma cadeia de caracteres por vez. Eu tinha uma string como esta " Test MSP " e quero deixar apenas um espaço.

Eu usei a abordagem que @Farhan fez, mas com algumas modificações:

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

Então eu corro minha atualização assim

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

Então eu recebi este resultado: Test MSP

Postando aqui se, no caso de alguém precisar, como eu.

Em execução no: Microsoft SQL Server 2016 (SP2)


0

Verifique e experimente o script abaixo (unidade testada) -

--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 todo mundo continua se referindo a uma única função REPLACE. Ou mesmo muitas chamadas de uma função REPLACE. Mas quando você tem uma saída dinâmica com um número desconhecido de espaços, ela não funciona. Qualquer pessoa que lide com esse problema regularmente sabe que REPLACE removerá apenas um único espaço, NÃO TODO, como deveria. E LTRIM e RTRIM parecem ter o mesmo problema. Deixe para a Microsoft. Aqui está um exemplo de saída que usa um loop WHILE para remover os valores ALL CHAR (32) (espaço).

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'

Aqui está a saída do código acima:

START:      C               A                         :END
START:CA:END

Agora, para dar um passo adiante e utilizá-lo em uma instrução UPDATE ou SELECT, altere-o para um 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

Em seguida, utilize a função em uma instrução SELECT ou 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
"SUBSTITUIR removerá apenas um único espaço." ...realmente? Esta demonstração simples não sugere: dbfiddle.uk/… . Você tem um exemplo de onde isso não funcionaria?
ADyson 11/11/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.