如何在mysql程序中使用SUBSTRING_INDEX函数

时间:2013-08-09 05:08:43

标签: mysql stored-procedures

我已经创建了一个mysql过程。这里是它的代码

BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a , b, d TEXT;
  DECLARE c INT Default 0;
  DECLARE cur1 CURSOR FOR SELECT id, school_id  FROM my_list;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN cur1;
  read_loop: LOOP
    FETCH cur1 INTO a, b;
    IF done THEN
      LEAVE read_loop;
    END IF;
     insertSchool: LOOP  
         SET c = c + 1;
         d = SUBSTRING_INDEX(b, ',', c);
       IF d = "" THEN
          LEAVE insertSchool;
       END IF;      
        INSERT INTO my_school (my_id, school_id) VALUES (a,b);
    END LOOP insertSchool;
  END LOOP;
  CLOSE cur1;
END

在这个cur1中,school_id为字符串,它包含以逗号分隔的学校ID。我想拆分这些ID并存储在不同的表中。但这一行d = SUBSTRING_INDEX(b,',',c);显示错误。任何人都可以提供解决方案如何在程序中使用SUBSTRING_INDEX?

1 个答案:

答案 0 :(得分:4)

您的直接问题不在于SUBSTRING_INDEX,而在于缺少SET

更改

d = SUBSTRING_INDEX(b, ',', c);

SET d = SUBSTRING_INDEX(b, ',', c);
^^^

<小时/> 现在,这将解决语法错误,但您需要对代码进行一些更改才能使其正常工作。

要从列表中获取第n个元素,您需要应用SUBSTRING_INDEX()两次

SUBSTRING_INDEX(SUBSTRING_INDEX(list, ',', n), ',', -1)

据说你的SP可能看起来像

DELIMITER $$
CREATE PROCEDURE my_sp()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a, b, d VARCHAR(12);
  DECLARE c, m INT DEFAULT 0;

  DECLARE cur1 CURSOR FOR SELECT id, school_id  FROM my_list;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO a, b;
    IF done THEN LEAVE read_loop; END IF;
    SET c = 0;
    SET m = CHAR_LENGTH(b) - CHAR_LENGTH(REPLACE(b, ',', ''));

    insertSchool: LOOP
       SET c = c + 1;
       IF c > m + 1 THEN LEAVE insertSchool; END IF;
       SET d = SUBSTRING_INDEX(SUBSTRING_INDEX(b, ',', c), ',', -1);
       INSERT INTO my_school (my_id, school_id) VALUES (a, d);
    END LOOP insertSchool;

  END LOOP;
  CLOSE cur1;
END$$
DELIMITER ;

这是 SQLFiddle 演示