如何在SQL中调用表的每一行上的函数?

时间:2013-07-02 22:04:07

标签: mysql sql database tsql cursor

我一直试图解决问题一段时间,并研究了游标和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循环(这可能需要永远!)?非常感谢。

1 个答案:

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

请参阅小提琴here。请注意,这将起作用,因为每列都使用;进行操作,并且如果列中没有值,您将获得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)

小提琴是here。此查询仅限于5列,您可以根据需要添加更多列。