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.
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.
Respostas:
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 char
ou 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"
REPLACE(field, ' ', '')
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
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
select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')
para remover todas as novas linhas e espaços de uma varchar
coluna. Se eu usasse '\ n' e '\ r' em vez de char (13) e char (10), não funcionaria.
substituir o t-sql http://msdn.microsoft.com/en-us/library/ms186862.aspx
substituir (val, '', '')
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
Isso faz o truque de remover os espaços nas seqüências de caracteres:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
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
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
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):
substituir (substituir (nome_da_coluna, CHAR (13), ''), CHAR (10), '')
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
.
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'
LTRIM
& RTRIM
?
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"))
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
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)
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;
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