Entfernen Sie alle Leerzeichen aus einer Zeichenfolge in SQL Server


222

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 von der Zeichenfolge entfernen, aber ich muss auch das Leerzeichen in der Mitte entfernen.


5
Mit "alle Leerzeichen" meinen Sie nur reguläre Leerzeichen? Oder meinen Sie Tabulatoren, CR, LF und andere Zeichen, die möglicherweise als Leerzeichen angezeigt werden?
Gordon Linoff

3
@ GordonLinoff: Ich meinte reguläre Leerzeichen
Ananth

Antworten:


385

Ersetzen Sie es einfach;

SELECT REPLACE(fld_or_variable, ' ', '')

Bearbeiten: Nur zur Verdeutlichung; Es ist ein globaler Ersatz, es besteht keine Notwendigkeit trim()oder Sorge um mehrere Leerzeichen für entweder charoder 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 

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"

2
Was ist, wenn zwischen Wörtern mehrere Leerzeichen stehen? REPLACE entfernt jeweils nur einen. Es sollte eine benutzerdefinierte Funktion geschrieben werden, die mehrere Leerzeichen entfernt.
Farhan

Dies scheint nachgestellte Leerzeichen nicht zu ersetzen
Ryan Sampson

7
Es sollte überall alle Leerzeichen ersetzen
Alex K.

Es werden alle Leerzeichen außer dem Nachlauf entfernt. Um nachfolgendes zu entfernen, fügen Sie TRIM hinzu (REPLACE (fld_or_variable, '', '')). Der Grund, warum es sogar mehrere Leerzeichen entfernt, ist, dass ... nun, es ändert jedes Leerzeichen in nichts, ob die Leerzeichen nebeneinander liegen oder nicht.
Snaplemouton

32
Ersetzen entfernt alle Leerzeichen, auch nach einem. Wenn die Daten danach immer noch Leerzeichen enthalten, handelt es sich wahrscheinlich nicht um Leerzeichen, sondern um nicht druckbare Zeichen wie Tabulatoren oder Carraige-Retouren.
HLGEM


28

Wenn es sich um ein Update für eine Tabelle handelt, müssen Sie dieses Update nur mehrmals ausführen, bis 0 Zeilen betroffen sind.

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


11

Referenz aus diesem Blog:

Erstellen Sie zunächst eine Beispieltabelle 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 zum Auswählen einer 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

2
Ist Ihnen klar, dass das OP ALLE Leerzeichen entfernen wollte, anstatt mehrere Leerzeichen durch ein einziges zu ersetzen?
Kaii

3
Dies sollte herabgestuft worden sein, da die Antwort nicht den Anforderungen des OP entspricht, sondern 4 positive Stimmen erhalten hat. Willkommen bei Stack Overflow.
Mr.J

@ Mr.J und jetzt hat es 9. Verrückte Welt.
Leszek P

11

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 verwendencolumn_name

Vielen Dank

Subroto


2
Ich musste verwenden select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ',''), um alle Zeilenumbrüche und Leerzeichen aus einer varcharSpalte zu entfernen . Wenn ich '\ n' und '\ r' anstelle von char (13) und char (10) verwendet habe, hat es nicht funktioniert.
Jan

Um dies auszuführen, muss "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

Wenn eine Zeichenfolge mehrere Leerzeichen enthält, 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

1
"@InputStr" sollte im Hauptteil der while-Schleife "@ResultStr" sein.
Jjoelson

@jjoelson Würde es Ihnen etwas ausmachen, diese Funktion zu erstellen und zu testen, bevor Sie auf Fehler hinweisen?
Farhan

7
Entschuldigung, ich habe unter Ihrer obigen Annahme gearbeitet, dass REPLACE jeweils nur einen entfernt. In diesem Fall würde diese Funktion eine Endlosschleife für Eingaben mit mehreren Leerzeichen verursachen. In Wirklichkeit ist die while-Schleife überhaupt nicht notwendig.
Jjoelson

2
Farhan, wenn REPLACE so funktioniert hat, wie Sie denken, dann ist @ jjoelsons erster Kommentar richtig. Andernfalls haben Sie eine Endlosschleife, da sich InputStr nie ändert, sodass ResultStr immer das erste REPLACE-Ergebnis ist. Der Grund, warum Ihr Code funktioniert, ist, dass REPLACE nur einmal benötigt wird. Es wird nie ein zweites Mal aufgerufen, egal welche Saite Sie darauf werfen. Fügen Sie einen Zähler hinzu und drucken Sie ihn bei jeder Iteration aus. Es wird immer 1 sein. REPLACE (InputStr, '', '') entfernt jedes Leerzeichen mit einem Aufruf.
Gilbert

6

Dies führt den Trick aus, die Leerzeichen auf den Zeichenfolgen zu entfernen:

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

2

Nur für den Fall, dass Sie Leerzeichen in allen Spalten TRIMMEN müssen, können Sie dieses Skript verwenden, um es 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 + ']))'+@comma
    FROM    #tempcols
    where id = @i

    select @i = @i+1
END

--execute the entire query
EXEC sp_executesql @trimmer

drop table #tempcols

2

Wenn Sie Leerzeichen, - und einen anderen Text aus der Zeichenfolge entfernen möchten, verwenden Sie Folgendes:

Angenommen, Sie haben eine Handynummer in Ihrer Tabelle wie "718-378-4957" oder "7183784957" und möchten die Handynummer ersetzen und erhalten. Verwenden Sie dann den folgenden Text.

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

Ergebnis: - 7183784957


2

Nur ein Tipp: Wenn Sie Probleme mit der Ersetzungsfunktion haben, ist der Datentyp möglicherweise auf nchar eingestellt (in diesem Fall ist die Länge fest und funktioniert nicht).


2


2

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

.


1

Ich hatte dieses Problem heute und das Ersetzen / Trimmen hat den Trick gemacht. 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' 

1
Warum sich mit dem LTRIM& beschäftigen RTRIM?
BanksySan

Cool. Hast du das Beispiel?
BanksySan

0

Entfernen der Leerzeichen in einer Zeichenfolge links und rechts. Platz in der Mitte entfernenReplace .

Sie können RTRIM()Leerzeichen von rechts und LTRIM()Leerzeichen von links entfernen, daher werden linke und rechte Leerzeichen wie folgt entfernt:

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

0

Syntax zum Ersetzen bestimmter Zeichen:

REPLACE ( string_expression , string_pattern , string_replacement )  

Zum Beispiel wird in der Zeichenfolge "HelloReplaceThingsGoing" das Wort "Ersetzen" durch "Wie" ersetzt

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

0

Eine funktionale Version (udf), die Leerzeichen, cr, lf, Tabulatoren entfernt oder konfigurierbar ist.

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

0

Aus irgendeinem Grund funktioniert das Ersetzen jedes Mal nur mit einer Zeichenfolge. Ich hatte eine Zeichenfolge wie diese " Test MSP " und möchte nur ein Leerzeichen lassen.

Ich habe den Ansatz von @Farhan verwendet, aber mit einigen Änderungen:

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 habe ich dieses Ergebnis bekommen: Test MSP

Hier posten, falls jemand es so braucht wie ich.

Läuft auf: Microsoft SQL Server 2016 (SP2)


0

Überprüfen und testen Sie das folgende Skript (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

Es scheint, dass sich jeder immer wieder auf eine einzelne REPLACE-Funktion bezieht. Oder sogar 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 ALLE, wie es sollte. Und LTRIM und RTRIM scheinen das gleiche Problem zu haben. Überlassen Sie es Microsoft. Hier ist eine Beispielausgabe, die eine WHILE-Schleife verwendet, um ALLE 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 noch 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

1
"REPLACE entfernt nur ein Leerzeichen." ...Ja wirklich? Diese einfache Demo schlägt nicht vor: dbfiddle.uk/… . Haben Sie ein Beispiel dafür, wo das nicht funktionieren würde?
ADyson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.