【问题标题】:Remove all spaces from a string in SQL Server从 SQL Server 中的字符串中删除所有空格
【发布时间】:2021-11-21 10:07:55
【问题描述】:

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

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

【问题讨论】:

  • “所有空格”是指只有常规空格吗?或者,您是指制表符、CR、LF 和其他可能显示为空格的字符吗?
  • @GordonLinoff :我的意思是常规空格

标签: sql sql-server string whitespace trim


【解决方案1】:

只需替换它;

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"

【讨论】:

  • 单词之间有多个空格怎么办? REPLACE 一次只删除一个。应该编写一个用户定义的函数来删除多个空格。
  • 这似乎不能替换尾随空格
  • 它应该替换所有的空格
  • 它将删除除尾随之外的所有空格。要删除尾随添加 TRIM(REPLACE(fld_or_variable, ' ', ''))。它甚至删除多个空格的原因是因为......它会将每个空格字符更改为无,无论空格是否彼此相邻。
  • Replace 删除所有空格,甚至尾随一个空格。如果完成此操作后数据中仍有明显的空格,则很可能它们不是空格,而是制表符或回车等不可打印的字符。
【解决方案2】:

我会使用替换

select REPLACE (' Hello , How Are You ?', ' ', '' )

REPLACE

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      REPLACE() function:

      REPLACE(field, ' ', '')
      

      【讨论】:

        【解决方案5】:

        如果字符串中有多个空格,则替换可能无法正常工作。为此,应使用以下函数。

        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
        

        【讨论】:

        • "@InputStr" 应该是 while 循环体中的 "@ResultStr"。
        • @jjoelson 你介意创建这个函数并在指出错误之前对其进行测试吗?
        • 对不起,我在您的上述假设下工作,即 REPLACE 一次只删除一个,在这种情况下,此函数会导致具有多个空格的输入出现无限循环。实际上,甚至根本不需要 while 循环。
        • Farhan,如果 REPLACE 以您认为的方式工作,那么@jjoelson 的第一条评论是正确的。否则你将有一个无限循环,因为 InputStr 永远不会改变,所以 ResultStr 将永远是第一个 REPLACE 结果。您的代码有效的原因是因为 REPLACE 只需要 1 次。无论您向它扔什么字符串,它都不会被第二次调用。添加一个计数器并在每次迭代时打印出来。它将始终为 1。REPLACE(InputStr, ' ', '') 将通过一次调用删除每个空格。
        【解决方案6】:

        如果是对表的更新,您只需多次运行此更新,直到它影响 0 行。

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

        【讨论】:

          【解决方案7】:

          以防万一您需要修剪所有列中的空格,您可以使用此脚本动态执行此操作:

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

          【讨论】:

            【解决方案8】:

            如果您想从字符串中删除空格、- 和其他文本,请使用以下内容:

            假设您的表格中有一个手机号码,例如“718-378-4957”或 ' 7183784957' 并且您想要替换并获取手机号码,然后使用以下文本。

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

            结果:-- 7183784957

            【讨论】:

              【解决方案9】:

              删除字符串左右的空格。要删除中间的空间,请使用Replace

              您可以使用RTRIM() 删除右侧的空格,使用LTRIM() 删除左侧的空格,从而删除左右空格,如下所示:

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

              【讨论】:

                【解决方案10】:

                Reference taken from this blog:

                首先,创建示例表和数据:

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

                【讨论】:

                • 您是否意识到 OP 想要删除所有空格而不是用一个替换多个空格?
                • 这应该被否决,因为答案不是 OP 所要求的,而是得到了 4 个赞成票。欢迎使用 Stack Overflow。
                • @Mr.J 现在有 9 个。疯狂的世界。
                【解决方案11】:

                我今天遇到了这个问题,replace / trim 成功了..见下文。

                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' 
                

                【讨论】:

                  【解决方案12】:

                  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

                  谢谢

                  副歌

                  【讨论】:

                  • 我不得不使用select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','') 来删除varchar 列中的所有换行符和空格。如果我使用 '\n' 和 '\r' 而不是 char(13) 和 char(10) 则不起作用。
                  • 要执行此操作,需要运行“SET SQL_SAFE_UPDATES = 0;”
                  • 这正是我所需要的!谢谢!!
                  【解决方案13】:

                  提示一下,如果您在使用替换功能时遇到问题,您可能会将数据类型设置为 nchar(在这种情况下,它是固定长度并且不起作用)。

                  【讨论】:

                    【解决方案14】:

                    这可以消除字符串上的空格:

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

                    【讨论】:

                      【解决方案15】:

                      【讨论】:

                        【解决方案16】:

                        replace(replace(column_Name,CHAR(13),''),CHAR(10),'')

                        【讨论】:

                          【解决方案17】:

                          这对我很有用:

                          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
                          

                          .

                          【讨论】:

                            【解决方案18】:

                            替换特定字符的语法:

                            REPLACE ( string_expression , string_pattern , string_replacement )  
                            

                            例如在字符串“HelloReplaceThingsGoing”中替换词被How替换

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

                            【讨论】:

                              【解决方案19】:

                              删除空格、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
                              

                              【讨论】:

                                【解决方案20】:

                                由于某种原因,每次替换只能处理一个字符串。 我有一个类似“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

                                如果有人像我一样需要它,请在此处发布。

                                运行时间: 微软 SQL Server 2016 (SP2)

                                【讨论】:

                                  【解决方案21】:

                                  似乎每个人都在提到一个单一的 REPLACE 函数。甚至多次调用 REPLACE 函数。但是当你有未知数量的空格的动态输出时,它就不起作用了。任何经常处理这个问题的人都知道,REPLACE 只会删除一个空格,而不是全部,因为它应该这样做。 LTRIM 和 RTRIM 似乎也有同样的问题。把它留给微软。 这是一个使用 WHILE 循环删除 ALL 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
                                  

                                  【讨论】:

                                  • "REPLACE 只会删除一个空格。" ...真的?这个简单的演示建议不要:dbfiddle.uk/…。你有一个例子说明这不起作用吗?
                                  【解决方案22】:

                                  检查并尝试以下脚本(单元测试)-

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

                                  【讨论】:

                                    【解决方案23】:

                                    尝试这样使用,如果正常空格没有被 LTRM 或 RTRM 删除

                                    LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(Column_data, CHAR(9), ''), CHAR(10), ''), CHAR(13), '')))
                                    

                                    【讨论】:

                                      【解决方案24】:

                                      我知道最初的问题是关于简单地替换 空格,但如果您需要替换所有空格,您可以使用 TRANSLATE 函数(自 Sql Server 2019 起)将给定的字符列表转换为更容易更换的东西。然后用 REPLACE 函数包装它。

                                      这样可以节省重复调用:

                                      DECLARE @Whitespace CHAR(4) = CHAR(0) + CHAR(9) + CHAR(13) + CHAR(10);
                                      SELECT REPLACE(
                                          TRANSLATE(' TEST    ', @Whitespace, '    '),
                                          ' ', '');
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 2021-09-27
                                        • 1970-01-01
                                        • 2019-11-25
                                        • 2012-12-22
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2018-06-18
                                        相关资源
                                        最近更新 更多