2011-03-18 21 views
1

私は、複数の文字列が '+'で区切られたフィールドを持つテーブルを持っています。文字列を行に分割する

文字列の各部分の長さは、2文字または3文字のいずれかです。例:'ab+cde+fg'

各行には1〜3の部分があります(一部の行は分割する必要がありません)。上記の例では、3行、つまり'ab','cd'および'fg'が返されます。

私はストアドプロシージャをインターネットで検索しましたが、私の特定のニーズに対応するものはありません。私はそのような手続きを書く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行AACCCDを挿入します。

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