Разделение строки на строки - PullRequest
1 голос
/ 18 марта 2011

У меня есть таблица с полем, состоящим из нескольких строк, разделенных знаком «+».

Каждая часть строки имеет длину 2 или 3 символа.Пример: 'ab+cde+fg'.

Каждая строка содержит от 1 до 3 частей (поэтому некоторые строки не нужно разбивать).Приведенный выше пример должен вернуть 3 строки: 'ab', 'cd' и 'fg'.

Я искал в Интернете хранимые процедуры, но, похоже, ни одна из них не подходит для моих конкретных нужд.Я не обладаю навыками SQL для написания такой процедуры.

1 Ответ

2 голосов
/ 18 марта 2011

Общий алгоритм работает так:

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 строки AA, CCC, D во временную таблицу # 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;
...