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

222

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

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

Ananth
источник
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
35

Я бы использовал ЗАМЕНУ

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

ЗАМЕНА

Эдуардо Крими
источник
28

Если это обновление таблицы, все, что вам нужно сделать, - запустить это обновление несколько раз, пока оно не затронет 0 строк.

update tableName
set colName = REPLACE(LTRIM(RTRIM(colName)), '  ', ' ')
where colName like '%  %'
SQL_King
источник
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
Anvesh
источник
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, '', '') удалит каждый пробел одним вызовом.
Гилберт
6

Это делает трюк удаления пробелов в строках:

UPDATE
    tablename
SET
    columnname = replace(columnname, ' ', '');
Марио Рохас
источник
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 (в этом случае это фиксированная длина, и она не будет работать).

starbyone
источник
2

Чтобы завершить все ответы, приведенные выше, в StackOverflow есть дополнительные сообщения о том, как обращаться со ВСЕМИ пробельными символами ( полный список этих символов см. На https://en.wikipedia.org/wiki/Whitespace_character ):

ZJA
источник
2

Replace (заменить (column_name, CHAR (13), ''), CHAR (10), '')

Абдулла Юсуф
источник
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"))
NarayanaReddy
источник
0

Синтаксис для замены определенных символов:

REPLACE ( string_expression , string_pattern , string_replacement )  

Например, в строке «HelloReplaceThingsGoing» слово «Заменить» заменяется на «Как»

SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO
Субаш J
источник
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
crokusek
источник
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;
Arulmouzhi
источник
-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