SQL Server의 문자열에서 모든 공백을 제거하십시오.


222

SQL Server 2008의 문자열에서 모든 공백을 제거하는 가장 좋은 방법은 무엇입니까?

LTRIM(RTRIM(' a b ')) 문자열의 오른쪽과 왼쪽에있는 모든 공백을 제거하지만 중간의 공백도 제거해야합니다.


5
"모든 공백"이란 정규 공백만을 의미합니까? 또는 공백으로 표시 될 수있는 탭, CR, LF 및 기타 문자를 의미합니까?
Gordon Linoff

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는 한 번에 하나씩 만 제거합니다. 여러 공백을 제거하는 사용자 정의 함수를 작성해야합니다.
Farhan

이것은 후행 공백을 대체하지 않는 것 같습니다
Ryan Sampson

7
그것은 모든 곳의 모든 공백을 대체해야합니다
Alex K.

후행을 제외한 모든 공백을 제거합니다. 후행을 제거하려면 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
OP가 여러 공간을 단일 공간으로 교체하는 대신 모든 공간을 제거하려고한다는 것을 알고 있습니까?
Kaii

3
OP에 의해 요구되는 답변이 아니기 때문에 다운 보트되어야했지만 대신 4 개의 업 보트를 받았습니다. 스택 오버플로에 오신 것을 환영합니다.
Mr.J

@ Mr.J 그리고 이제 9가 있습니다. Crazy world.
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

감사

서브 로토


2
select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')에서 모든 줄 바꿈과 공백을 제거하는 데 사용해야 했습니다 varchar. char (13) 및 char (10) 대신 '\ n'및 '\ r'을 사용하면 작동하지 않습니다.
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입니다. REPLACE (InputStr, '', '')는 한 번의 호출로 모든 공간을 제거합니다.
Gilbert

6

이것은 문자열에서 공백을 제거하는 트릭을 수행합니다.

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

2

모든 열에서 공백을 트리밍해야하는 경우를 위해이 스크립트를 사용하여 동적으로 수행 할 수 있습니다.

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


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"에서 Replace word는 How로 바뀝니다.

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

그런 다음이 결과를 얻었습니다 : Test 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도 같은 문제가있는 것 같습니다. Microsoft에 맡기십시오. 다음은 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.