2011-03-18 4 views
1

'+'로 구분 된 여러 문자열로 구성된 필드가있는 테이블이 있습니다.문자열을 행으로 나누기

문자열의 각 부분의 길이는 2 또는 3 자입니다. 예 : 'ab+cde+fg'.

각 행에는 1 ~ 3 개의 부분이 있습니다 (따라서 일부 행은 분할 할 필요가 없습니다). 위의 예는 'ab', 'cd''fg'의 3 행을 반환해야합니다.

인터넷에서 저장 프로 시저를 검색했지만 특정 요구 사항에 맞지 않는 것도 있습니다. 필자는 이러한 절차를 작성하는 SQL 기술이 없습니다.

답변

2

일반적인 알고리즘은 다음과 같이 작동

DECLARE input CHAR(100); 
DECLARE separator_position INTEGER; 

SET input = 'AA+CCC+D'; 

CREATE TABLE 
    #output 
(
    part CHAR(10) 
); 

SET separator_position = POSITION('+' IN input); 

WHILE separator_position > 0 DO 

    INSERT INTO #output (part) VALUES (SUBSTRING(input, 1, separator_position - 1)); 
    SET input = SUBSTRING(input, separator_position + 1, 100); 

    SET separator_position = POSITION('+' IN input); 
END WHILE; 

INSERT INTO #output(part) VALUES (SUBSTRING(input, 1, 10)); 

SELECT * FROM #output; 

이 코드는 임시 테이블 #output로 3 행 AA, CCC, D을 삽입합니다.

여기에 멀티 문자 구분 기호로 작동하는 버전이며 또한 일부 카운터가 포함되어 완벽하게

DECLARE @input STRING; 
DECLARE @delimiter_position INTEGER; 
DECLARE @delimiter STRING; 

TRY DROP TABLE #output; CATCH ALL END TRY; 

SET @delimiter = CHAR(13) + CHAR(10); 
SET @input = 'AA' + CHAR(13) + CHAR(10) + 'CCC' + CHAR(13) + CHAR(10) + 'D'; 

CREATE TABLE 
    #output 
(
    counter AUTOINC 
    , part CHAR(10) 
); 

SET @delimiter_position = POSITION(@delimiter IN @input); 

WHILE @delimiter_position > 0 DO 

    INSERT INTO #output (part) VALUES (LEFT(@input, @delimiter_position - 1)); 
    SET @input = RIGHT(@input, LENGTH(@input) - (@delimiter_position + LENGTH(@delimiter)) + 1); 

    SET @delimiter_position = POSITION(@delimiter IN @input); 
END WHILE; 

INSERT INTO #output(part) VALUES (LEFT(@input, LENGTH(@input))); 

SELECT * FROM #output; 
+0

작품! 시간 내 주셔서 감사합니다. – Philippe