将字符串拆分为行

发布于 2024-10-22 22:38:12 字数 262 浏览 2 评论 0原文

我有一个表,其中一个字段由多个字符串组成,并用“+”分隔。

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

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

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

I have a table with a field consisting of multiple strings seperated by a '+'.

Each part of the string has a length of either 2 or 3 chars. Example: 'ab+cde+fg'.

Each row has 1 to 3 parts (so some rows don't need spliting). The above example should return 3 rows: 'ab', 'cd' and 'fg'.

I have searched the internet for stored procedures, but none seem to work for my particular needs. I don't have the SQL-skills myself to write such procedure.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三生一梦 2024-10-29 22:38:12

一般算法的工作原理如下:

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;

The general algorithm works like this:

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;

This code will insert 3 rows AA, CCC, D into the temporary table #output.

Here is a version that works with multi character delimiters and also contains a part counter:

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文