0

一段时间以来,我一直在尝试解决一个问题,并研究了诸如游标和 while 循环之类的方法。但是,我认为也许这些对于我的目的来说不是必需的。我正在使用 MS SQL Studio 2012。我的表中有一个列,其中包含用分号分隔的变量字符串数据(我收到了此数据):

THIS IS ONE COLUMN:
245;345;2114;
3421;34;
31;

我正在尝试根据分号将数据分成列数,例如:

FIRST COLUMN    |  SECOND COLUMN   | THIRD COLUMN   | etc
245                345                2114
3421               34
31

我有一个函数可以用分号将每一行分隔成一个表。在一行上调用函数:旧表中的“3421;34”变为:

ID  |  DATA
1      3421
2      34

我的问题是,如何将此函数应用于主表中的每一行。我应该使用while循环吗(这可能需要很长时间!)?非常感谢。

4

1 回答 1

0

如果您需要一个快速而肮脏的解决方案,两个SUBSTRING_INDEX函数将完成工作:

SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 1), ';', -1) col1,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 2), ';', -1) col2,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 3), ';', -1) col3,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 4), ';', -1) col4,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 5), ';', -1) col5
FROM
  yourtable

在这里看小提琴。请注意,这将起作用,因为每列都以 结尾;,并且如果列中不存在值,您将获得 EMPTY 列而不是 NULL 列。

编辑:如果您需要更新现有表,则需要先添加一些新列:

ALTER TABLE yourtable ADD COLUMN col1 VARCHAR(20);
ALTER TABLE yourtable ADD COLUMN col2 VARCHAR(20);
...

然后,您可以启动 UPDATE 查询:

UPDATE yourtable
SET
  col1=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 1), ';', -1),
  col2=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 2), ';', -1),
  col3=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 3), ';', -1),
  col4=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 4), ';', -1),
  col5=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 5), ';', -1)

小提琴在这里。此查询限制为 5 列,如果需要,您可以添加更多。

于 2013-07-02T22:13:22.507 回答