2011-06-15 5 views
-1

입력 내의 글자들 사이의 공간을 생성하는 방법SQL 서버 2005 (SET 기반)

Column 
ab2e 
mnop 
a2t1y 

Id Col1 Col2 Col3 Col4 Col5 Col6 
1 a b    e 
2 m n o  p 
3 a    t  y 

숫자는 최초 입력에서 때문에 공백 수를 나타내는 출력 , b 다음에 2가 있기 때문에 b에서 2 칸 뒤에 문자 e가 나타납니다. 어떤 공간이 없기 때문에 이미 열과 만하면 사이에 '정상'문자열의 내용을 배포하는 방법을 가지고있는 경우에 두 번째 입력에서 는 문자는 서로

감사

+2

데이터 집합이있는 경우에만 세트 기반 방식으로 작업 할 수 있습니다 (예 : 많은 행의 데이터. 문자열 조작 ** ** ** set-based operation이 아니며 SQL Server가별로 좋지 않습니다. –

+0

이 TSQL 문제를 http://beyondrelational.com/puzzles/tsql/에서 봐야한다고 생각합니다. 58/korean/playing-chess-in-tsql-part-1.aspx. 그 문제에 대한 최선의 해결책은 도전이 끝났을 때 출판 될 것입니다. 아마도 당신이 사용할 수있는 무엇인가. –

+1

@Mikael : OP가 이미 알고 있다고 확신합니다. (http://stackoverflow.com/questions/6304734/doubt-in-creating-a-sierpinsk-carpet-using-tsql-set-based) with 그 사이트. –

답변

1

후에 나타납니다

DECLARE @InputString varchar(100), @pos int, @result varchar(100); 
SET @InputString = 'a2t1y'; 
SET @result = @InputString; 
SET @pos = PATINDEX('%[0-9]%', @result); 
WHILE @pos <> 0 BEGIN 
    SET @result = STUFF(@result, @pos, 1, SPACE(SUBSTRING(@result, @pos, 1))); 
    SET @pos = PATINDEX('%[0-9]%', @result); 
END 
SELECT @result; 

출력 :

--------------------- 
a t y 
01 ab[space][space]e 같은 문자열로 ab2e 문자열 등을 확대하기위한 용액은, 여기에 가능한 해결책

CREATE FUNCTION ExpandString (@String varchar(100)) 
RETURNS varchar(100) 
AS BEGIN 
    DECLARE @pos int, @result varchar(100); 
    SET @result = @String; 
    SET @pos = PATINDEX('%[0-9]%', @result); 
    WHILE @pos <> 0 BEGIN 
    SET @result = STUFF(@result, @pos, 1, SPACE(SUBSTRING(@result, @pos, 1))); 
    SET @pos = PATINDEX('%[0-9]%', @result); 
    END 
    RETURN @result; 
END 

그래서이 같은 열을 호출 할 수 있습니다 : 23,516,

그것은 아마 좋은 생각이 함수로 구현하는 것입니다

SELECT …, dbo.ExpandString(t.SomeColumn), … 
그것은 주목해야한다

하지만, 그이 솔루션은 한자리의 '매크로'만 지원합니다. 즉, a12b은이 기능을 사용하여 a[1 space][2 spaces]b으로 변환됩니다. 이는 반드시 기대했던 것만은 아닙니다. 이 아닌 수치 사이의 숫자의 순서로 정수를 인식 할 필요하면 그래서, 여기에 대체 솔루션입니다 :

CREATE FUNCTION ExpandString (@String varchar(100)) 
RETURNS varchar(100) 
AS BEGIN 
    DECLARE @pos int, @lastpos int, @len int, @isnum bit, 
      @sub varchar(100), @result varchar(100); 
    SET @result = ''; 
    SET @pos = 1; 
    SET @len = LEN(@String); 
    SET @isnum = ISNUMERIC(SUBSTRING(@String, @pos, 1)); 
    WHILE @pos <= @len BEGIN 
    SET @lastpos = @pos; 
    WHILE @pos <= @len AND ISNUMERIC(SUBSTRING(@String, @pos, 1)) = @isnum 
     SET @pos = @pos + 1; 
    SET @sub = SUBSTRING(@String, @lastpos, @pos - @lastpos); 
    SET @result = @result + CASE @isnum WHEN 1 THEN SPACE(@sub) ELSE @sub END; 
    SET @isnum = @isnum^1; 
    END; 
    RETURN @result; 
END 

두 버전 모두 시작과 입력 문자열의 끝에서 두 숫자를 인식.

+0

괜찮아요.하지만 세트 기반으로하는 방법. – agnihotri

+0

@agnihotri : 정확하게 설정해야하는 것은 무엇입니까? –

관련 문제