Xóa tất cả khoảng trắng khỏi chuỗi trong SQL Server


222

Cách tốt nhất để xóa tất cả các khoảng trắng khỏi chuỗi trong SQL Server 2008 là gì?

LTRIM(RTRIM(' a b ')) sẽ xóa tất cả các khoảng trắng ở bên phải và bên trái của chuỗi, nhưng tôi cũng cần xóa khoảng trắng ở giữa.


5
"Tất cả các khoảng trắng" có nghĩa là bạn chỉ có không gian thông thường? Hoặc, ý bạn là các tab, CR, LF và các ký tự khác có thể hiển thị dưới dạng khoảng trắng?
Gordon Linoff

3
@GordonLinoff: Ý tôi là không gian thông thường
Ananth

Câu trả lời:


385

Đơn giản chỉ cần thay thế nó;

SELECT REPLACE(fld_or_variable, ' ', '')

Chỉnh sửa: Chỉ để làm rõ; nó là sự thay thế toàn cầu, không cần phải trim()lo lắng về nhiều không gian cho một trong hai charhoặc 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 

Kết quả

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
Nếu có nhiều khoảng trắng giữa các từ thì sao? REPLACE chỉ loại bỏ một lần. Một hàm do người dùng định nghĩa nên được viết để loại bỏ nhiều khoảng trắng.
Farhan

Điều này dường như không thay thế các khoảng trắng kéo dài
Ryan Sampson

7
Nó sẽ thay thế tất cả các khoảng trắng ở mọi nơi
Alex K.

Nó sẽ loại bỏ tất cả các khoảng trắng trừ dấu vết. Để xóa dấu vết, hãy thêm TRIM (REPLACE (fld_or_variable, '', '')). Lý do tại sao nó loại bỏ thậm chí nhiều khoảng trắng là bởi vì ... nó cũng thay đổi mọi ký tự khoảng trắng thành không có gì ngăn cách các khoảng trắng nằm cạnh nhau hay không.
snaplemouton

32
Thay thế loại bỏ tất cả các không gian thậm chí theo sau một. Nếu vẫn còn khoảng trắng trong dữ liệu sau khi hoàn thành, có khả năng chúng không phải là khoảng trắng mà là các ký tự không thể in được như các tab hoặc trả về carraige.
HLGEM


28

Nếu đó là một bản cập nhật trên một bảng, tất cả những gì bạn phải làm là chạy bản cập nhật này nhiều lần cho đến khi nó ảnh hưởng đến 0 hàng.

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


11

Tham khảo lấy từ blog này:

Đầu tiên, Tạo bảng mẫu và dữ liệu:

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

Tập lệnh để CHỌN chuỗi mà không cần thêm không gian:

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

Kết quả:

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
Bạn có nhận ra OP muốn xóa TẤT CẢ các không gian thay vì thay thế nhiều không gian bằng một không gian duy nhất không?
Kaii

3
Điều này đáng lẽ đã bị hạ cấp do câu trả lời không theo yêu cầu của OP, nhưng thay vào đó, nó có 4 upvote. Chào mừng bạn đến với Stack Overflow.
Mr.J

@ Mr.J và bây giờ nó có 9. Thế giới điên rồ.
Leszek P

11

Làm việc 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

Bạn có thể sử dụng "column_name"hoặccolumn_name

Cảm ơn

Subroto


2
Tôi đã phải sử dụng select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')để xóa tất cả các dòng mới và khoảng trắng khỏi một varcharcột. Nếu tôi sử dụng '\ n' và '\ r' thay vì char (13) và char (10) thì nó không hoạt động.
Ngày

để thực hiện điều này, cần phải chạy "SET SQL_SAFE_UPDATE = 0;"
Shai Epstein


6

Nếu có nhiều khoảng trắng trong một chuỗi, thì thay thế có thể không hoạt động chính xác. Cho rằng, nên sử dụng chức năng sau đây.

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

Thí dụ:

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

Đầu ra:

aaaaaaaaaa

1
"@InputStr" phải là "@ResultStr" trong phần thân của vòng lặp while.
jjoelson

@jjoelson bạn có phiền khi tạo chức năng này và kiểm tra nó trước khi chỉ ra sai lầm không?
Farhan

7
Xin lỗi, tôi đã làm việc theo giả định trên của bạn rằng REPLACE chỉ loại bỏ từng cái một, trong trường hợp đó, hàm này sẽ gây ra một vòng lặp vô hạn cho các đầu vào có nhiều khoảng trắng. Trong thực tế, vòng lặp while thậm chí không cần thiết.
jjoelson

2
Farhan, nếu REPLACE hoạt động theo cách bạn nghĩ thì bình luận đầu tiên của @ jjoelson là chính xác. Nếu không, bạn sẽ có một vòng lặp vô hạn vì InputStr không bao giờ thay đổi, do đó resultStr sẽ luôn là kết quả REPLACE đầu tiên. Lý do mã của bạn hoạt động là vì REPLACE chỉ cần 1 lần. Nó không bao giờ được gọi lần thứ hai cho dù bạn ném chuỗi nào. Thêm một bộ đếm và in nó ra với mỗi lần lặp. Nó sẽ luôn là 1. REPLACE (InputStr, '', '') sẽ xóa mọi khoảng trống chỉ bằng một cuộc gọi.
Gilbert

6

Đây là thủ thuật loại bỏ khoảng trắng trên chuỗi:

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

2

Chỉ trong trường hợp bạn cần TRIM khoảng trắng trong tất cả các cột, bạn có thể sử dụng tập lệnh này để thực hiện nó một cách linh hoạt:

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

nếu bạn muốn xóa khoảng trắng, - và một văn bản khác khỏi chuỗi thì hãy sử dụng như sau:

giả sử bạn có số điện thoại trong Bảng như '718-378-4957' hoặc '7183784957' và bạn muốn thay thế và lấy số điện thoại sau đó sử dụng Văn bản sau.

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

Kết quả: - 7183784957


2

Chỉ là một mẹo, trong trường hợp bạn gặp sự cố với chức năng thay thế, bạn có thể có kiểu dữ liệu được đặt thành nchar (trong trường hợp đó là độ dài cố định và nó sẽ không hoạt động).


2


2

Điều này hữu ích cho tôi:

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

Tôi đã có vấn đề này ngày hôm nay và thay thế / cắt đã thực hiện các mẹo .. xem bên dưới.

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

trước và sau :

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

1
Tại sao phải bận tâm với LTRIM& RTRIM?
BanksySan

Mát mẻ. Bạn có ví dụ không?
BanksySan

0

Để loại bỏ khoảng trắng trong một chuỗi trái và phải. Để loại bỏ không gian ở giữa sử dụng Replace.

Bạn có thể sử dụng RTRIM()để xóa khoảng trắng ở bên phải và LTRIM()xóa khoảng trắng ở bên trái do đó các khoảng trắng bên trái và bên phải được xóa như sau:

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

0

Cú pháp để thay thế một ký tự cụ thể:

REPLACE ( string_expression , string_pattern , string_replacement )  

Ví dụ: trong chuỗi "HelloReplaceThingsGoing" Thay thế từ được thay thế bằng Cách

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

0

Một phiên bản chức năng (udf) loại bỏ khoảng trắng, cr, lf, tab hoặc cấu hình.

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

Kết quả: '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

Vì một số lý do, việc thay thế chỉ hoạt động với một chuỗi mỗi lần. Tôi đã có một chuỗi như thế này " Test MSP " và tôi chỉ muốn để lại một khoảng trống.

Tôi đã sử dụng cách tiếp cận mà @Farhan đã làm, nhưng với một số sửa đổi:

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

Sau đó, tôi chạy bản cập nhật của mình như thế này

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

Sau đó tôi nhận được kết quả này: Kiểm tra MSP

Đăng ở đây nếu trong trường hợp ai đó cần nó như tôi đã làm.

Chạy trên: Microsoft SQL Server 2016 (SP2)


0

Kiểm tra và thử đoạn script dưới đây (Đơn vị đã kiểm tra) -

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

Dường như mọi người cứ nhắc đến một chức năng REPLACE duy nhất. Hoặc thậm chí nhiều cuộc gọi của chức năng REPLACE. Nhưng khi bạn có đầu ra động với một số lượng không gian không xác định, nó sẽ không hoạt động. Bất cứ ai thường xuyên xử lý vấn đề này đều biết rằng REPLACE sẽ chỉ xóa một khoảng trống, KHÔNG PHẢI TẤT CẢ, như bình thường. Và LTRIM và RTRIM dường như có cùng một vấn đề. Để lại cho Microsoft. Đây là một đầu ra mẫu sử dụng Vòng lặp WHILE để loại bỏ TẤT CẢ (32) giá trị (khoảng trắng).

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'

Đây là đầu ra của đoạn mã trên:

START:      C               A                         :END
START:CA:END

Bây giờ để tiến thêm một bước và sử dụng nó trong câu lệnh CẬP NHẬT hoặc CHỌN, hãy thay đổi nó thành 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

Sau đó sử dụng hàm trong câu lệnh CHỌN hoặc CHERTN:

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 sẽ chỉ xóa một khoảng trắng." ...có thật không? Bản demo đơn giản này gợi ý không phải: dbfiddle.uk/ . Bạn đã có một ví dụ về nơi mà nó sẽ không làm việc?
ADyson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.