[sql-server] T-SQL에서 중복 공백을 단일 공백으로 바꾸기

주어진 필드에 문자 사이에 두 개 이상의 공백이 없는지 확인해야합니다 (모든 공백은 고려하지 않고 공백 만 포함).

그래서

'single    spaces   only'

로 바뀌어야한다

'single spaces only'

아래는 작동하지 않습니다

select replace('single    spaces   only','  ',' ')

결과적으로

'single  spaces  only'

저는 CLR 기반 솔루션보다 네이티브 T-SQL을 고수하는 것을 선호합니다.

생각?



답변

더 깔끔하게 :

select string = replace(replace(replace(' select   single       spaces',' ','<>'),'><',''),'<>',' ')

산출:

단일 공간 선택


답변

이것은 작동합니다.

declare @test varchar(100)
set @test = 'this   is  a    test'

while charindex('  ',@test  ) > 0
begin
   set @test = replace(@test, '  ', ' ')
end

select @test


답변

한 행에 특정 수 이상의 공백이 없다는 것을 알고 있다면 바꾸기를 중첩 할 수 있습니다.

replace(replace(replace(replace(myText,'  ',' '),'  ',' '),'  ',' '),'  ',' ')

4 개의 교체는 최대 16 개의 연속 공백을 수정해야합니다 (16, 8, 4, 2, 1).

훨씬 더 길 수 있다면 인라인 함수와 같은 작업을 수행해야합니다.

CREATE FUNCTION strip_spaces(@str varchar(8000))
RETURNS varchar(8000) AS
BEGIN
    WHILE CHARINDEX('  ', @str) > 0
        SET @str = REPLACE(@str, '  ', ' ')

    RETURN @str
END

그럼 그냥

SELECT dbo.strip_spaces(myText) FROM myTable


답변

update mytable
set myfield = replace (myfield, '  ',  ' ')
where charindex('  ', myfield) > 0 

바꾸기는 모든 이중 공백에서 작동하므로 여러 번 바꿀 필요가 없습니다. 이것은 세트 기반 솔루션입니다.


답변

함수를 통해 재귀 적으로 수행 할 수 있습니다.

CREATE FUNCTION dbo.RemSpaceFromStr(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS
BEGIN
  RETURN (CASE WHEN CHARINDEX('  ', @str) > 0 THEN
    dbo.RemSpaceFromStr(REPLACE(@str, '  ', ' ')) ELSE @str END);
END

예를 들면 다음과 같습니다.

SELECT dbo.RemSpaceFromStr('some   string    with         many     spaces') AS NewStr

보고:

NewStr
some string with many spaces

또는 @ agdk26 또는 @Neil Knight (그러나 더 안전함)에서 설명한 방법을 기반으로하는 솔루션은
위의 출력을 반환합니다.

SELECT REPLACE(REPLACE(REPLACE('some   string    with         many     spaces'
  , '  ', ' ' + CHAR(7)), CHAR(7) + ' ', ''), ' ' + CHAR(7), ' ') AS NewStr
--but it remove CHAR(7) (Bell) from string if exists...

또는

SELECT REPLACE(REPLACE(REPLACE('some   string    with         many     spaces'
  , '  ', ' ' + CHAR(7) + CHAR(7)), CHAR(7) + CHAR(7) + ' ', ''), ' ' + CHAR(7) + CHAR(7), ' ') AS NewStr
--but it remove CHAR(7) + CHAR(7) from string

작동 원리 :
여기에 이미지 설명 입력

주의 :
공백을 대체하는 데 사용되는 문자 / 문자열은 문자열의 시작 또는 끝에 존재하지 않아야하며 단독으로 사용되어서는 안됩니다.


답변

이것은 다소 무차별 적이지만 작동합니다.

CREATE FUNCTION stripDoubleSpaces(@prmSource varchar(max)) Returns varchar(max)
AS
BEGIN
    WHILE (PATINDEX('%  %', @prmSource)>0)
     BEGIN
        SET @prmSource = replace(@prmSource  ,'  ',' ')
     END

    RETURN @prmSource
END

GO

-- Unit test -- 
PRINT dbo.stripDoubleSpaces('single    spaces   only')

single spaces only


답변

다음은 앞뒤의 공백과 문자열 내의 여러 공백을 정리하기 위해 만든 간단한 함수입니다. 한 번에 최대 약 108 개의 공간과 줄에있는만큼의 블록을 우아하게 처리합니다. 필요한 경우 더 큰 공간 청크가있는 행을 추가하여 8 배로 늘릴 수 있습니다. 빠른 성능으로 보이며 대규모 응용 프로그램에서 일반화 된 사용에도 불구하고 문제를 일으키지 않았습니다.

CREATE FUNCTION [dbo].[fnReplaceMultipleSpaces] (@StrVal AS VARCHAR(4000))
RETURNS VARCHAR(4000)
AS
BEGIN

    SET @StrVal = Ltrim(@StrVal)
    SET @StrVal = Rtrim(@StrVal)

    SET @StrVal = REPLACE(@StrVal, '                ', ' ')  -- 16 spaces
    SET @StrVal = REPLACE(@StrVal, '        ', ' ')  -- 8 spaces
    SET @StrVal = REPLACE(@StrVal, '    ', ' ')  -- 4 spaces
    SET @StrVal = REPLACE(@StrVal, '  ', ' ')  -- 2 spaces
    SET @StrVal = REPLACE(@StrVal, '  ', ' ')  -- 2 spaces (for odd leftovers)

RETURN @StrVal

END