将字符串拆分为行

时间:2011-03-18 13:21:08

标签: sql string split advantage-database-server

我有一个表格,其中包含由'+'分隔的多个字符串。

字符串的每个部分的长度为2或3个字符。示例:'ab+cde+fg'

每行有1到3个部分(因此有些行不需要拆分)。上面的示例应返回3行:'ab''cd''fg'

我在互联网上搜索了存储过程,但似乎没有一个能满足我的特殊需求。我自己没有SQL技能来编写这样的程序。

1 个答案:

答案 0 :(得分: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;

此代码会将3行AACCCD插入临时表#output。

这是一个适用于多字符分隔符的版本,还包含一个部分计数器:

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;