【问题标题】:how to use SUBSTRING_INDEX function in mysql procedure如何在mysql过程中使用SUBSTRING_INDEX函数
【发布时间】:2013-08-11 00:15:06
【问题描述】:

我已经创建了一个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?

【问题讨论】:

标签: mysql stored-procedures


【解决方案1】:

您的直接问题不是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演示

【讨论】:

  • @naveengoyal 有帮助吗?您的问题需要更多帮助吗?如果这是您要查找的内容,请考虑accept 答案。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 2014-07-14
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多