2015-01-12 5 views
0

데이터가 '|'으로 분리 된 매우 큰 문자열 값이 있습니다. 일부 문자열 값에서 예를문자열에서 특정 문자의 양쪽에 공백을 제거해야합니다.

Declare @string NVARCHAR(MAX) 

Set @String = 'My Name|Address 1|Address 2|......' 

를 들어

은 내가 '|'의 양쪽에 공백을 제거 할 필요가

@String = My Name|Address 1 | Address 2|....... 

같은 것을 가지고있다. 하나의 공간이 있다면, 내가

Set @string = Replace(@string,' |','|')  
Set @string = Replace(@string,'| ','|') 

을 사용하여 내가 하나 개 이상의 공간이 카운트는 모두 replace이 문제가 해결됩니다 결합

@String = My Name|Address 1 | Address 2|....... 
+0

는 방법을 설명 않습니다 쿼리 INT http://stackoverflow.com/questions/2647/how 내부의 논리를 작성했습니다 -do-i-split-a-string-so-i-can-access-item-x가 작동하지 않습니까? – Joe

+0

split 함수를 사용하여 문자열을 분할 한 다음 분할 된 값으로 LTRIM-RTRIM을 사용하고 다시 연결합니다. 가장 안전한 솔루션이 있습니다. – KumarHarsh

답변

0

나는

DECLARE @String NVARCHAR(MAX) = 'My Name|Address 1  |Address 2 |' 
     -- Since '|' inside the STUFF removes the first word, we append that word 
SELECT LEFT(LTRIM(@String),1) + STUFF((SELECT '|' + CAST(Ids AS VARCHAR(500)) [text()] 
     FROM 
     (
      -- Converts each value to rows and remove the spaces on start and end 
      SELECT LTRIM(RTRIM(PARSENAME(REPLACE(Split.a.value('.', 'VARCHAR(500)'),'-','.'),1))) 'Ids' 
      FROM 
      (
       SELECT CAST ('<M>' + REPLACE(@String, '|', '</M><M>') + '</M>' AS XML) AS Data  
      ) AS A 
      CROSS APPLY Data.nodes ('/M') AS Split(a) 
     )TAB 
     FOR XML PATH(''), TYPE) 
     .value('.','NVARCHAR(MAX)'),1,2,'') + '|' COLS 
+0

이것은 루프없이 작동하며 최고의 성능을 보입니다 @Sandeep Kurapati –

+0

예, 작동하지만 마지막 '|' 문자열에. 나는 루프와 함께 사용할 수있는 무언가를 찾고있다. 감사합니다. @Sarath Avanavu –

+0

K. @Sandeep Kurapati를 업데이트하겠습니다. –

0

처럼 특정 할 수없는 경우. 이

Declare @string varchar(500) 

set @String = 'My Name|Address 1 | Address 2| Address 3 |.......' 

select Replace(Replace(@string,' |','|'),'| ','|') 
0

여기 하나 해결책을 시도해보십시오

declare @s varchar(8000); 
set @s = 'test     | test|test' 

declare @tmp varchar(8000); 
declare @x int; 
set @x = 4096 

while @x > 0 
    begin 
     set @tmp = replace(replace(@s, replicate(' ', @x) + '|', '|'), '|' + replicate(' ', @x), '|') 
     if (@tmp = @s) set @x = @x/2 
     set @s = @tmp 
    end 

print @s 

아이디어는 교체가 더 이상 문자열을 변경 할 때까지 공백을 대체하지 않는 것입니다. 단순히 '|' 및 '| 'with'| '를 사용하지만, 위의 코드는 조금 더 똑똑하고 큰 덩어리를 대체합니다 (4096 공간에서 시작하여 각 단계마다 2로 나눕니다).

1

이 쿼리를 사용하면 도움이 될 것입니다.

Declare @string 

Set @String = 'My Name|Address 1 | Address 2 |......' 

--Query to remove spaces before and after a specific character 

SET @String=(SELECT replace(replace(replace(@String, '|','|'),' ',''),'/t',' ')) 
+0

이것은 My와 Name 사이의 공간을 분명히 제거했습니다. 나는 '|'근처에 공백을 제거하는 것을 찾고있다. –

관련 문제