2017-09-08 15 views

답변

3

여기에 논리적 인 접근 방식은 다음 REPLACE 최초의 우주까지 CHARINDEXSUBSTRING를 사용하여 두 개의 섹션으로 문자열을 분할하고, 최초의 우주 후 첫 번째 공백 다음에 오는 문자열 다음에 CONCAT을 사용하여 문자열을 다시 묶습니다. 예 :

DECLARE @s VARCHAR(15) = '123 456 789'; 

SELECT BeforeSpace = SUBSTRING(@s, 1, CHARINDEX(' ', @s)), 
     AfterSpace = SUBSTRING(@s, CHARINDEX(' ', @s), LEN(@s)), 
     ReplaceAfterSpace = REPLACE(SUBSTRING(@s, CHARINDEX(' ', @s), LEN(@s)), ' ', ''), 
     Result = CONCAT(SUBSTRING(@s, 1, CHARINDEX(' ', @s)), 
         REPLACE(SUBSTRING(@s, CHARINDEX(' ', @s), LEN(@s)), ' ', '')); 

그러나, 그것은 REPLACE를 사용하는 모든 공백을 제거하고, 첫 번째가 원래 STUFF를 사용하던 공간을 다시 삽입 실제로 간단하다 :

DECLARE @s VARCHAR(15) = '123 456 789'; 

SELECT STUFF(REPLACE(@s, ' ', ''), CHARINDEX(' ', @s), 0, ' '); 

을 모든 것은 그 다음 할 일은 남아 공간이없는 경우를 확인하십시오. 전체 예 :

DECLARE @T TABLE (s VARCHAR(15)); 
INSERT @T VALUES ('123 456 789'), ('123456789'), ('123456 789'), ('123 4 5 6 789'); 

SELECT Original = s, 
     Method1 = CASE WHEN CHARINDEX(' ', s) = 0 THEN s 
         ELSE CONCAT(SUBSTRING(s, 1, CHARINDEX(' ', s)), 
           REPLACE(SUBSTRING(s, CHARINDEX(' ', s), LEN(s)), ' ', '')) 
        END, 
     Method2 = CASE WHEN CHARINDEX(' ', s) = 0 THEN s 
         ELSE STUFF(REPLACE(s, ' ', ''), CHARINDEX(' ', S), 0, ' ') 
        END 
FROM @T; 

출력

Original  Method1   Method2 
------------------------------------------- 
123 456 789  123 456789  123 456789 
123456789  123456789  123456789 
123456 789  123456 789  123456 789 
123 4 5 6 789 123 456789  123 456789 

NB 나는 당신은 당신이 처음부터 떨어져 모든 공백을 대체 할 것인지, 제 2 공간을 대체 할 말을 할 때 그 가정을 만들었습니다 . 내 가정이 틀렸고 교체 할 공간이 2 번째 공간이면 작동하지 않습니다.

1

이 그것을 수행해야합니다

DECLARE @number AS NVARCHAR(12); 
SELECT @number = '123 456 789'; 

SELECT STUFF(@number, CHARINDEX(' ', @number, CHARINDEX(' ', @number) + 1), 1, '') AS REMOVED_SECOND_SPACE; 
0
DECLARE @s VARCHAR(12) = '111 222 333' 

SELECT SUBSTRING(@s, 0, LEN(@s) - CHARINDEX(' ', REVERSE(@s)) + 1) 
    + SUBSTRING(@s, LEN(@s) - CHARINDEX(' ', REVERSE(@s)) + 2, CHARINDEX(' ', REVERSE(@s))); 
0

음, 다른 답변 이외에, 나는 당신이 뒤에 공백 세 자리를 할 것인지, 가정을 기반으로 simpliest을 게시합니다 다음 나머지 :

declare @x1 varchar(15), @x2 varchar(15), @x3 varchar(15), @x4 varchar(15), @x5 varchar(15) 
set @x1 = '123456789' 
set @x2 = '123 456789' 
set @x3 = '123 456 789' 
set @x4 = '123456 789' 
set @x5 = '1 2 3 4 5 6 7 8 9' 

select stuff(replace(@x1, ' ', ''), 4, 0, ' ') 
select stuff(replace(@x2, ' ', ''), 4, 0, ' ') 
select stuff(replace(@x3, ' ', ''), 4, 0, ' ') 
select stuff(replace(@x4, ' ', ''), 4, 0, ' ') 
select stuff(replace(@x5, ' ', ''), 4, 0, ' ') 

모든 출력이 될 것입니다 동일 : 123 456789.