mysql - 如何减少mysql中的这段代码来分离给定的字符串

标签 mysql

USE `coordinates`$$

DROP PROCEDURE IF EXISTS `testx2`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `testx2`(x1 VARCHAR(225),delim VARCHAR(3))

BEGIN
    DECLARE str VARCHAR(225);    

     DECLARE str2 VARCHAR(225); 

    DECLARE str3 VARCHAR(225);

        DECLARE len INT DEFAULT 0;

        DECLARE templen INT DEFAULT 0;


   SET str = x1;



    SET @str2 = SUBSTRING_INDEX(str,',',1); /*col 1*/

        SET @len1 = CHAR_LENGTH(@str2)+1;  

        SET @templen = @len1 ;   


  SET @str3 = SUBSTR(SUBSTRING_INDEX(str,',',2),@templen+1); /*col 2*/

        SET @len2 = CHAR_LENGTH(@str3)+1;

        SET @templen = @len1 + @len2;


   SET @str4 = SUBSTR(SUBSTRING_INDEX(str,',',3),@templen+1); /*col 3*/

        SET @len3 = CHAR_LENGTH(@str4)+1;

        SET @templen = @len1 + @len2 + @len3;

        SET @str5 = SUBSTR(SUBSTRING_INDEX(str,',',4),@templen+1); /*col 4*/

        SET @len4 = CHAR_LENGTH(@str5)+1;

        SET @templen = @len1 + @len2 + @len3 + @len4;


        SET @str6 = SUBSTR(SUBSTRING_INDEX(str,',',5),@templen+1); /*col 5*/

        SET @len5 = CHAR_LENGTH(@str6)+1;

        SET @templen = @len1 + @len2 + @len3 + @len4 + @len5;


        SET @str7 = SUBSTR(SUBSTRING_INDEX(str,',',6),@templen+1); /*col 6*/

        SET @len6 = CHAR_LENGTH(@str7)+1;

        SET @templen = @len1 + @len2 + @len3 + @len4 + @len5 + @len6;


     SET @str8 = SUBSTR(SUBSTRING_INDEX(str,',',7),@templen+1); /*col 7*/

        SET @len7 = CHAR_LENGTH(@str8)+1;

        SET @templen = @len1 + @len2 + @len3 + @len4 + @len5 + @len6 + @len7;


      SET @str9 = SUBSTR(SUBSTRING_INDEX(str,',',8),@templen+1); /*col 8*/

        SET @len8 = CHAR_LENGTH(@str9)+1;

        SET @templen = @len1 + @len2 + @len3 + @len4 + @len5 + @len6 + @len7 + @len8;     


    SET @str10 = SUBSTR(SUBSTRING_INDEX(str,',',9),@templen+1); /*col 9*/

        SET @str11 = SUBSTRING_INDEX(str,',',-1);/*col 10*/



      INSERT INTO test2(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
      VALUES(@str2,@str3,@str4,@str5,@str6,@str7,@str8,@str9,@str10,@str11);

     SELECT * FROM test2;

END$$

DELIMITER ;

最佳答案

此处不需要您的变量声明。最好也使用过程的 delim 参数,因此您可以编写与以下内容相同的内容:

DROP PROCEDURE IF EXISTS `testx2`;

DELIMITER $$;
CREATE DEFINER=`root`@`localhost` PROCEDURE `testx2`(x1 VARCHAR(225),delim VARCHAR(3))
BEGIN
      INSERT INTO test2(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
      VALUES(
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 1), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 2), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 3), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 4), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 5), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 6), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 7), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 9), delim, -1),
          SUBSTRING_INDEX(SUBSTRING_INDEX(x1, delim, 9), delim, -1),
          SUBSTRING_INDEX(x1, delim, -1),
      );

     SELECT * FROM test2;
END$$
DELIMITER ;

使用循环在这里没有帮助。请注意 SUBSTRING 的嵌套调用,它消除了 @templen 变量的需要。

关于mysql - 如何减少mysql中的这段代码来分离给定的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25223361/

相关文章:

python - 每当 mysql 服务重新启动时,uwsgi 如何重新建立与远程 mysql 数据库的连接

mysql - 选择以 _timestamp 结尾且匹配 regxp 的 MySQL 表

php - 在 PHP 中循环访问单个服务器上的 MySQL 数据库

mysql - "Alter ignore"+ "unique key"去重,mysql和sql server

mysql - 根据同一个表中的值更新 Mysql 表

php - 无法找出 SQL 字段中数据的重复条目以及随机单元格删除(PHP/MYSQL)

mysql - phpmyadmin中int(1)和int(2)有什么区别

MySQL错误1064但不是保留字

PHP DateTime 解析时间而不是日期

php - Magento 更改数据库表前缀