从SQL Server中的字符串中删除所有空格


222

在SQL Server 2008中从字符串中删除所有空格的最佳方法是什么?

LTRIM(RTRIM(' a b ')) 将删除字符串左右两侧的所有空格,但是我还需要删除中间的空格。


5
“所有空格”是指仅规则空格吗?或者,您是说制表符,CR,LF和其他可能显示为空格的字符吗?
Gordon Linoff

3
@GordonLinoff:我的意思是常规空格
Ananth

Answers:


385

只需更换它;

SELECT REPLACE(fld_or_variable, ' ', '')

编辑: 只是为了澄清;它的全局替换,没有必要trim(),也不用担心多个空间对于任何一个charvarchar

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
如果单词之间有多个空格怎么办?REPLACE一次只能删除一个。应该编写一个删除多个空格的用户定义函数。
法汉(Farhan)2012年

这似乎并不能替代尾随的空格
Ryan Sampson

7
应该到处替换所有空白
亚历K.

它将除去尾随以外的所有空白。要删除尾随,请添加TRIM(REPLACE(fld_or_variable,'',)))。它删除甚至多个空格的原因是……无论空格是否相邻,它都会将每个空格字符更改为零。
snaplemouton

32
替换删除所有空格,甚至尾随空格。如果完成此操作后数据中仍然有空格,则很可能它们不是空格,而是不可打印的字符,例如制表符或行列返回。
HLGEM 2013年


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次赞成。欢迎使用堆栈溢出。
J.先生

@ Jr.J现在有9.疯狂的世界。
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'代替char(13)和char(10),那么它将无法正常工作。
1

要执行此操作,需要运行“ 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
在while循环的主体中,“ @ InputStr”应为“ @ResultStr”。
jjoelson

@jjoelson您介意创建此功能并在指出错误之前对其进行测试吗?
Farhan

7
抱歉,我在您上面的假设下工作,即REPLACE一次只能删除一个,在这种情况下,此函数将导致具有多个空格的输入的无限循环。实际上,while循环根本没有必要。
jjoelson

2
Farhan,如果REPLACE以您认为的方式工作,那么@jjoelson的第一条评论是正确的。否则,您将陷入无限循环,因为InputStr永远不会改变,因此ResultStr将始终是第一个REPLACE结果。您的代码起作用的原因是因为只需要REPLACE 1次。无论您向它扔什么字符串,都永远不会第二次调用它。添加一个计数器,并在每次迭代时打印出来。它将始终为1。REPLACE(InputStr,'','')将通过一次调用删除每个空格。
吉尔伯特


2

万一您需要在所有列中都保留TRIM空间,则可以使用以下脚本动态地执行此操作:

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

这对我很有用:

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
为什么要打扰LTRIMRTRIM
2016年

凉。你有例子吗?
2016年

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

删除空格,cr,lf,制表符或可配置文件的功能版本(udf)。

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

由于某种原因,每次替换只能使用一个字符串。我有这样的字符串“ Test 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函数的调用。但是,当动态输出的空格数未知时,它将无法正常工作。定期处理此问题的任何人都知道,REPLACE只会删除一个空格,而不是所有空格。LTRIM和RTRIM似乎有相同的问题。留给微软。这是使用WHILE循环删除所有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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.