Удалить все пробелы из строки в SQL Server


222

Каков наилучший способ удалить все пробелы из строки в SQL Server 2008?

LTRIM(RTRIM(' a b ')) удалит все пробелы справа и слева от строки, но мне также нужно убрать пробел в середине.


5
Под "всеми пробелами" вы подразумеваете только обычные пробелы? Или вы имеете в виду вкладки, CR, LF и другие символы, которые могут отображаться в виде пробелов?
— Гордон Линофф

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
Что если между словами есть несколько пробелов? REPLACE удаляет только по одному за раз. Должна быть написана пользовательская функция, которая удаляет несколько пробелов.
— Фархан

Похоже, это не заменит оставшиеся пробелы
— Райан Сэмпсон

7
Это должно заменить все пробелы везде
— Алекс К.

Это удалит все пробелы, кроме трейлинга. Чтобы удалить трейлинг, добавьте TRIM (REPLACE (fld_or_variable, '', '')). Причина, по которой он удаляет даже несколько пробелов, заключается в том, что ... ну, он меняет все символы пробела на ничто, если пробелы находятся рядом друг с другом или нет.
— snaplemouton

32
Заменить удаляет все пробелы, даже один за ним. Если после этого в данных все еще остаются отдельные пробелы, скорее всего, это не пробелы, а непечатные символы, такие как табуляция или возврат каррейга.
— 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
     [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
Вы понимаете, что ОП хотел удалить ВСЕ пробелы вместо замены нескольких пробелов одним?
— Кай

3
Это должно было быть отклонено из-за того, что ответ не соответствует требованиям ОП, но вместо этого он получил 4 отзыва. Добро пожаловать в переполнение стека.
— Mr.J

@ Mr.J и теперь у него 9. Безумный мир.
— Лешек П

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), это не сработало.
— Ян

чтобы выполнить это, необходимо выполнить «SET SQL_SAFE_UPDATES = 0;»
— Шай Эпштейн


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.
— Джоэлсон

@jjoelson Не могли бы вы создать эту функцию и проверить ее, прежде чем указывать на ошибки?
— Фархан

7
Извините, я работал под вашим предположением, что REPLACE удаляет только по одному за раз, и в этом случае эта функция вызовет бесконечный цикл для входов с несколькими пробелами. В действительности, цикл while даже не нужен вообще.
— Джоэлсон

2
Фархан, если 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

Чтобы завершить все ответы, приведенные выше, в 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

Проверьте и попробуйте приведенный ниже скрипт (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

Кажется, что все продолжают ссылаться на одну функцию REPLACE. Или даже много вызовов функции ЗАМЕНА. Но когда у вас есть динамический вывод с неизвестным количеством пробелов, он не будет работать. Любой, кто занимается этой проблемой на регулярной основе, знает, что REPLACE удалит только один пробел, а НЕ ВСЕ, как и должно быть. И LTRIM и RTRIM, кажется, имеют ту же проблему. Оставьте это Microsoft. Вот пример вывода, который использует цикл 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

1
«REPLACE удалит только один пробел». ...действительно? Это простое демо предлагает не: dbfiddle.uk/… . У вас есть пример, где это не сработает?
— ADyson
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.