Was ist der beste Weg, um alle Leerzeichen aus einer Zeichenfolge in SQL Server 2008 zu entfernen?
LTRIM(RTRIM(' a b '))
würde alle Leerzeichen rechts und links der Zeichenfolge entfernen, aber ich muss auch das Leerzeichen in der Mitte entfernen.
Einfach austauschen;
SELECT REPLACE(fld_or_variable, ' ', '')
Bearbeiten: Nur zur Klarstellung; Da es sich um eine globale Ersetzung handelt, müssen Sie weder trim()
noch mehrere Leerzeichen für char
oder varchar
beachten:
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
Ergebnis
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"
Wenn es sich um ein Update für eine Tabelle handelt, müssen Sie dieses Update mehrmals ausführen, bis es 0 Zeilen betrifft.
update tableName
set colName = REPLACE(LTRIM(RTRIM(colName)), ' ', ' ')
where colName like '% %'
REPLACE(field, ' ', '')
Erstellen Sie zunächst eine Probentabelle und Daten:
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
Skript für SELECT-Zeichenfolge ohne zusätzliche Leerzeichen:
SELECT
[Rno]
,[Name] AS StringWithSpace
,LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([Name],CHAR(32),'()'),')(',''),'()',CHAR(32)))) AS StringWithoutSpace
FROM tbl_RemoveExtraSpaces
Ergebnis:
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
t-sql replace http://msdn.Microsoft.com/en-us/library/ms186862.aspx
ersetze (val, '', '')
100% arbeiten
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
Sie können "column_name"
oder column_name
verwenden.
Vielen Dank
Subroto
Wenn in einer Zeichenfolge mehrere Leerzeichen vorhanden sind, funktioniert das Ersetzen möglicherweise nicht ordnungsgemäß. Dafür sollte die folgende Funktion verwendet werden.
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
Beispiel:
select dbo.RemoveAllSpaces('aa aaa aa aa a')
Ausgabe:
aaaaaaaaaa
Dadurch werden die Leerzeichen in den Zeichenfolgen entfernt:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
Nur ein Tipp, falls Sie Probleme mit der Replace-Funktion haben, ist der Datentyp möglicherweise auf nchar gesetzt (in diesem Fall hat dies eine feste Länge und funktioniert nicht).
Nur für den Fall, dass Sie Leerzeichen in allen Spalten zuschneiden müssen, können Sie dieses Skript verwenden, um dies dynamisch auszuführen:
--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 + ']))'[email protected]
FROM #tempcols
where id = @i
select @i = @i+1
END
--execute the entire query
EXEC sp_executesql @trimmer
drop table #tempcols
Um alle Antworten zu vervollständigen, gibt es in StackOverflow zusätzliche Beiträge zum Umgang mit ALLEN Leerzeichen (siehe https://en.wikipedia.org/wiki/Whitespace_character für eine vollständige Liste dieser Zeichen). :
wenn Sie Leerzeichen, - und einen anderen Text aus der Zeichenfolge entfernen möchten, verwenden Sie Folgendes:
angenommen, Sie haben in Ihrer Tabelle eine Handynummer wie '718-378-4957' oder '7183784957' und Sie möchten die Handynummer ersetzen und dann den folgenden Text verwenden.
select replace(replace(replace(replace(MobileNo,'-',''),'(',''),')',''),' ','') from EmployeeContactNumber
Ergebnis: - 7183784957
Es scheint, dass sich alle immer wieder auf eine einzelne REPLACE-Funktion beziehen. Oder auch viele Aufrufe einer REPLACE-Funktion. Wenn Sie jedoch eine dynamische Ausgabe mit einer unbekannten Anzahl von Leerzeichen haben, funktioniert dies nicht. Jeder, der sich regelmäßig mit diesem Problem befasst, weiß, dass REPLACE nur ein einzelnes Leerzeichen entfernt, NICHT ALLES, wie es sollte. Und LTRIM und RTRIM scheinen dasselbe Problem zu haben. Überlassen Sie es Microsoft. Hier ist eine Beispielausgabe, die eine WHILE-Schleife verwendet, um ALL CHAR (32) -Werte (Leerzeichen) zu entfernen.
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'
Hier ist die Ausgabe des obigen Codes:
START: C A :END
START:CA:END
Um einen Schritt weiter zu gehen und es in einer UPDATE- oder SELECT-Anweisung zu verwenden, ändern Sie es in ein 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
Verwenden Sie dann die Funktion in einer SELECT- oder INSERT-Anweisung:
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
Ich hatte diese Ausgabe heute und ersetze/trimm den Trick .. siehe unten.
update table_foo
set column_bar = REPLACE(LTRIM(RTRIM(column_bar)), ' ', '')
vorher und nachher :
old-bad: column_bar | New-fixed: column_bar
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
das ist nützlich für mich:
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
.
ersetzen (Ersetzen (Spaltenname, Zeichen (13), ''), Zeichen (10), '')
Aus irgendeinem Grund funktioniert die Ersetzung immer nur mit einer Zeichenfolge .. __ Ich hatte eine Zeichenfolge wie " Test MSP " und möchte nur ein Leerzeichen lassen.
Ich habe den Ansatz von @Farhan verwendet, jedoch mit einigen Modifikationen:
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
Dann führe ich mein Update so aus
UPDATE tbTest SET Description = dbo.ReplaceAll(Description, ' ', ' ') WHERE ID = 14225
Dann erhielt ich dieses Ergebnis: Test MSP
Postet hier, falls jemand es braucht, wie ich es getan habe.
Ausführen unter: Microsoft SQL Server 2016 (SP2)
Syntax zum Ersetzen bestimmter Zeichen:
REPLACE ( string_expression , string_pattern , string_replacement )
In der Zeichenfolge "HelloReplaceThingsGoing" wird beispielsweise Word ersetzen durch How ersetzt
SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO
Um die Leerzeichen in einer Zeichenfolge links und rechts zu entfernen. Um Platz in der Mitte zu entfernen, Replace
.
Sie können RTRIM()
verwenden, um Leerzeichen von rechts zu entfernen, und LTRIM()
, um Leerzeichen von links zu entfernen.
SELECT * FROM table WHERE LTRIM(RTRIM(username)) = LTRIM(RTRIM("Bob alias baby"))
Eine funktionale Version (udf), die Leerzeichen, cr, lf, Registerkarten oder konfigurierbar entfernt.
select Common.ufn_RemoveWhitespace(' 234 asdf wefwef 3 x ', default) as S
Ergebnis: '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