주어진 필드에 문자 사이에 두 개 이상의 공백이 없는지 확인해야합니다 (모든 공백은 고려하지 않고 공백 만 포함).
그래서
'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