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.
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.
Risposte:
Sostituiscilo semplicemente;
SELECT REPLACE(fld_or_variable, ' ', '')
Modifica:
solo per chiarire; è un sostituto globale, non è necessario trim()
o preoccuparsi di più spazi per uno char
o 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"
REPLACE(field, ' ', '')
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
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
select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')
per rimuovere tutte le newline e gli spazi da una varchar
colonna. Se avessi usato '\ n' e '\ r' invece di char (13) e char (10) non funzionava.
t-sql sostituisce http://msdn.microsoft.com/en-us/library/ms186862.aspx
sostituisci (val, '', '')
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
Questo fa il trucco di rimuovere gli spazi sulle stringhe:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
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
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
Per completare tutte le risposte di cui sopra, ci sono altri post su StackOverflow su come gestire TUTTI i caratteri degli spazi bianchi (vedere https://en.wikipedia.org/wiki/Whitespace_character per un elenco completo di questi caratteri):
replace (sostituire (nome_colonna, CHAR (13), ''), CHAR (10), '')
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
.
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'
LTRIM
& RTRIM
?
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"))
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
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)
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;
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