เอาช่องว่างทั้งหมดออกจากสายอักขระใน SQL Server


222

วิธีที่ดีที่สุดในการลบช่องว่างทั้งหมดออกจากสตริงใน SQL Server 2008 คืออะไร

LTRIM(RTRIM(' a b ')) จะลบช่องว่างทั้งหมดที่ด้านขวาและด้านซ้ายของสตริง แต่ฉันต้องลบช่องว่างตรงกลางด้วย


5
โดย "พื้นที่สีขาวทั้งหมด" หมายถึงเฉพาะช่องว่างปกติหรือไม่ หรือคุณหมายถึงแท็บ CR, LF และอักขระอื่น ๆ ที่อาจแสดงเป็นช่องว่าง
Gordon Linoff

3
@GordonLinoff: ฉันหมายถึงช่องว่างปกติ
Ananth

คำตอบ:


385

เพียงแทนที่มัน

SELECT REPLACE(fld_or_variable, ' ', '')

แก้ไข: เพียงเพื่อชี้แจง; เป็นการแทนที่ระดับโลกโดยไม่จำเป็นต้องtrim()กังวลเกี่ยวกับช่องว่างหลาย ๆ อันสำหรับcharหรือ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 

ผลลัพธ์

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
เกิดอะไรขึ้นถ้ามีช่องว่างสีขาวหลายคำระหว่างคำ? แทนที่จะลบทีละครั้งเท่านั้น ควรเขียนฟังก์ชันที่ผู้ใช้กำหนดซึ่งจะลบช่องว่างหลายช่อง
Farhan

ดูเหมือนว่านี่จะไม่แทนที่ช่องว่างสีขาวต่อท้าย
Ryan Sampson

7
ควรแทนที่ช่องว่างทั้งหมดทุกที่
Alex K.

มันจะลบช่องว่างสีขาวทั้งหมดยกเว้นส่วนท้าย ในการลบการต่อท้ายเพิ่ม TRIM (REPLACE (fld_or_variable, '', '')) เหตุผลที่ทำให้มันลบช่องว่างหลาย ๆ อันก็เพราะ ... เพราะมันเปลี่ยนทุกช่องว่างเพื่อไม่ให้มีช่องว่างติดกันหรือไม่
snaplemouton

32
แทนที่จะลบช่องว่างทั้งหมดแม้ต่อท้ายหนึ่งช่อง หากยังคงมีช่องว่างที่เห็นได้ชัดเจนในข้อมูลหลังจากทำสิ่งนี้แล้วอาจเป็นไปได้ว่าพวกเขาไม่ใช่ช่องว่าง แต่มีอักขระที่ไม่สามารถพิมพ์ได้เช่นแท็บหรือ carraige ส่งคืน
HLGEM


28

หากเป็นการอัปเดตบนโต๊ะสิ่งที่คุณต้องทำคือเรียกใช้การอัปเดตนี้หลายครั้งจนกว่าจะมีผลกับ 0 แถว

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


11

การอ้างอิงที่นำมาจากบล็อกนี้:

ก่อนสร้างตารางตัวอย่างและข้อมูล:

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

สตริงสคริปต์เป็น SELECT โดยไม่มีช่องว่างเพิ่มเติม:

SELECT
     [Rno]
    ,[Name] AS StringWithSpace
    ,LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([Name],CHAR(32),'()'),')(',''),'()',CHAR(32)))) AS StringWithoutSpace
FROM tbl_RemoveExtraSpaces

ผลลัพธ์:

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
คุณรู้หรือไม่ว่า OP ต้องการลบช่องว่างทั้งหมดแทนที่จะแทนที่ช่องว่างหลายช่องด้วยช่องเดียว
Kaii

3
สิ่งนี้ควรถูกลดระดับลงเนื่องจากคำตอบไม่ได้เป็นไปตามความต้องการของ OP แต่กลับได้ 4 upvotes ยินดีต้อนรับสู่ Stack Overflow
Mr.J

@ Mr.J และตอนนี้ก็มี 9. Crazy world
Leszek P

11

ทำงาน 100%

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

คุณสามารถใช้"column_name"หรือcolumn_name

ขอบคุณ

Subroto


2
ฉันต้องใช้select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')เพื่อลบบรรทัดใหม่และช่องว่างทั้งหมดออกจากvarcharคอลัมน์ ถ้าฉันใช้ '\ n' และ '\ r' แทนที่จะเป็นถ่าน (13) และถ่าน (10) มันไม่ทำงาน
Jan

ในการดำเนินการนี้จำเป็นต้องเรียกใช้ "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

หากมีช่องว่างสีขาวหลายแห่งในสตริงการแทนที่อาจทำงานไม่ถูกต้อง สำหรับสิ่งนั้นควรใช้ฟังก์ชั่นต่อไปนี้

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

ตัวอย่าง:

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

เอาท์พุท:

aaaaaaaaaa

1
"@InputStr" ควรเป็น "@ResultStr" ในเนื้อหาของ while loop
jjoelson

@jjoelson คุณจะสนใจที่จะสร้างฟังก์ชั่นนี้และทดสอบก่อนที่จะชี้ให้เห็นข้อผิดพลาด?
Farhan

7
ขออภัยฉันทำงานภายใต้ข้อสันนิษฐานข้างต้นของคุณว่า REPLACE จะลบทีละครั้งเท่านั้นในกรณีนี้ฟังก์ชันนี้จะทำให้เกิดการวนซ้ำไม่สิ้นสุดสำหรับอินพุตที่มีช่องว่างหลายช่อง ในความเป็นจริงขณะที่ลูปไม่จำเป็นเลย
jjoelson

2
Farhan ถ้า REPLACE ทำงานอย่างที่คุณคิดว่าเป็นเช่นนั้นความคิดเห็นแรกของ @jjoelson นั้นถูกต้อง มิฉะนั้นคุณจะมีการวนซ้ำไม่สิ้นสุดเนื่องจาก InputStr ไม่เคยเปลี่ยนแปลงดังนั้น ResultStr จะเป็นผลลัพธ์การแทนที่แรกเสมอ สาเหตุที่รหัสของคุณใช้งานได้เนื่องจากจำเป็นต้องใช้ REPLACE เพียง 1 ครั้งเท่านั้น มันไม่เคยถูกเรียกเป็นครั้งที่สองไม่ว่าคุณจะเล่นบทอะไร เพิ่มตัวนับและพิมพ์ด้วยการวนซ้ำแต่ละครั้ง มันจะเป็น 1. REPLACE (InputStr, '', '') จะลบทุกช่องว่างด้วยการโทรเพียงครั้งเดียว
Gilbert

6

นี่เป็นเคล็ดลับในการลบช่องว่างบนสตริง:

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

2

ในกรณีที่คุณต้องการตัดช่องว่างในทุกคอลัมน์คุณสามารถใช้สคริปต์นี้เพื่อทำแบบไดนามิก:

--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

หากคุณต้องการลบช่องว่าง -, และข้อความอื่นจากสตริงให้ใช้ดังต่อไปนี้:

สมมติว่าคุณมีหมายเลขโทรศัพท์มือถือในตารางเช่น '718-378-4957' หรือ '7183784957' และคุณต้องการแทนที่และรับหมายเลขโทรศัพท์จากนั้นใช้ข้อความต่อไปนี้

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

ผลลัพธ์: - 7183784957


2

เพียงแค่ปลายในกรณีที่คุณมีปัญหากับฟังก์ชั่นการแทนที่คุณอาจมีประเภทข้อมูลที่ตั้งเป็น nchar (ในกรณีที่มันมีความยาวคงที่และมันจะไม่ทำงาน)


2

เพื่อให้คำตอบทั้งหมดข้างต้นเสร็จสมบูรณ์มีโพสต์เพิ่มเติมเกี่ยวกับ StackOverflow เกี่ยวกับวิธีจัดการกับอักขระช่องว่างทั้งหมด (ดูที่https://en.wikipedia.org/wiki/Whitespace_characterสำหรับรายการทั้งหมดของตัวละครเหล่านี้):



2

สิ่งนี้มีประโยชน์สำหรับฉัน:

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

ฉันมีปัญหานี้ในวันนี้และแทนที่ / ตัดได้ทำเคล็ดลับ .. ดูด้านล่าง

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

ก่อนและหลัง :

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

1
ทำไมต้องกังวลกับLTRIM& RTRIM?
BanksySan

เย็น. คุณมีตัวอย่างหรือไม่
BanksySan

0

เพื่อลบช่องว่างในสตริงซ้ายและขวา Replaceเพื่อลบพื้นที่ในการใช้งานกลาง

คุณสามารถใช้RTRIM()เพื่อลบช่องว่างจากด้านขวาและLTRIM()เพื่อลบช่องว่างจากด้านซ้ายดังนั้นช่องว่างด้านซ้ายและด้านขวาจะถูกลบดังนี้:

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

0

ไวยากรณ์สำหรับการแทนที่อักขระเฉพาะ:

REPLACE ( string_expression , string_pattern , string_replacement )  

ตัวอย่างเช่นในสตริง "HelloReplaceThingsGoing" แทนที่คำถูกแทนที่ด้วยวิธี

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

0

เวอร์ชันเชิงหน้าที่ (udf) ที่ลบช่องว่าง, cr, lf, แท็บหรือกำหนดค่าได้

select Common.ufn_RemoveWhitespace(' 234   asdf   wefwef 3  x   ', default) as S

ผลลัพธ์: '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

ด้วยเหตุผลบางอย่างการแทนที่ใช้งานได้กับสตริงเดียวเท่านั้นในแต่ละครั้ง ฉันมีสตริงเช่น " การทดสอบ MSP " และฉันต้องการออกจากที่เดียว

ฉันใช้วิธีการที่ @Farhan ทำ แต่มีการดัดแปลงบางอย่าง:

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

จากนั้นฉันเรียกใช้การอัปเดตของฉันเช่นนี้

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

จากนั้นฉันได้ผลลัพธ์นี้: ทดสอบ MSP

โพสต์ที่นี่หากในกรณีที่มีคนต้องการมันเช่นฉัน

ทำงานบน: Microsoft SQL Server 2016 (SP2)


0

ตรวจสอบและลองสคริปต์ด้านล่าง (ทดสอบหน่วย) -

--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

ดูเหมือนว่าทุกคนยังคงอ้างถึงฟังก์ชั่นแทนที่เดียว หรือแม้กระทั่งการเรียกฟังก์ชัน REPLACE จำนวนมาก แต่เมื่อคุณมีเอาต์พุตแบบไดนามิกที่มีจำนวนช่องว่างที่ไม่รู้จักมันจะไม่ทำงาน ใครก็ตามที่จัดการกับปัญหานี้เป็นประจำรู้ว่า REPLACE จะลบพื้นที่เดียวไม่ใช่ทั้งหมดเท่าที่ควร และ LTRIM และ RTRIM ดูเหมือนจะมีปัญหาเดียวกัน ทิ้งไว้ที่ Microsoft นี่คือตัวอย่างเอาต์พุตที่ใช้ WHILE Loop เพื่อลบค่า CHAR (32) ช่องว่างทั้งหมด

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'

นี่คือผลลัพธ์ของโค้ดด้านบน:

START:      C               A                         :END
START:CA:END

ทีนี้ที่จะก้าวไปอีกขั้นและใช้มันในคำสั่ง UPDATE หรือ SELECT ให้เปลี่ยนเป็น 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

จากนั้นใช้ฟังก์ชันในคำสั่ง SELECT หรือ 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
"REPLACE จะลบพื้นที่เดียวเท่านั้น" ...จริงๆ? สาธิตง่ายๆนี้แสดงให้เห็นไม่dbfiddle.uk/... คุณเคยเห็นตัวอย่างของสิ่งที่ใช้ไม่ได้หรือไม่
ADyson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.