StoredProcedure的(在csvString VARCHAR(1000))CSV字符串表存储过程
csvString有1,2,3,4,5,6
我想这个CSV字符串转换成像表下面
如果CSV串是1,2,3,4,5,6,7,8-然后
在此先感谢
StoredProcedure的(在csvString VARCHAR(1000))CSV字符串表存储过程
csvString有1,2,3,4,5,6
我想这个CSV字符串转换成像表下面
如果CSV串是1,2,3,4,5,6,7,8-然后
在此先感谢
验证,并根据需要调整:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.18 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP PROCEDURE IF EXISTS `insert_split`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP FUNCTION IF EXISTS `split_str`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `tbl`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl` (
-> `col1` VARCHAR(255),
-> `col2` VARCHAR(255)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> -- MySQL Split String Function by Federico Cargnelutti
mysql> -- http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
mysql> CREATE FUNCTION `split_str` (
-> `str` TEXT,
-> `delim` CHAR(1),
-> `item` INT UNSIGNED
->) RETURNS VARCHAR(255)
-> BEGIN
-> DECLARE `_current_str` TEXT DEFAULT SUBSTRING_INDEX(`str`, `delim`, `item`);
-> DECLARE `_prev_str` TEXT DEFAULT SUBSTRING_INDEX(`str`, `delim`, `item`-1);
-> IF `_current_str` = `_prev_str` THEN
-> RETURN NULL;
-> ELSE
-> RETURN REPLACE(
-> SUBSTRING(
-> `_current_str`,
-> CHAR_LENGTH(`_prev_str`) + 1
-> ),
-> `delim`, '');
-> END IF;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `insert_split`(`str` TEXT)
-> BEGIN
-> DECLARE `_delim` CHAR(1) DEFAULT ',';
-> DECLARE `_iteration` INT UNSIGNED DEFAULT 0;
-> DECLARE `_current_value` VARCHAR(255);
-> DECLARE `_odd_value` VARCHAR(255) DEFAULT '';
-> `repeat`: LOOP
-> SET `_iteration` := `_iteration` + 1;
-> SET `_current_value` := `split_str`(`str`, `_delim`, `_iteration`);
-> IF `_current_value` IS NULL THEN
-> LEAVE `repeat`;
-> END IF;
-> IF (`_iteration` MOD 2) = 0 THEN
-> INSERT INTO `tbl` (`col1`, `col2`)
-> VALUES (NULLIF(`_odd_value`, ''), NULLIF(`_current_value`, ''));
-> ELSE
-> SET `_odd_value` := `_current_value`;
-> END IF;
-> END LOOP `repeat`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `insert_split`('1,2,3,4,5,6');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `col1`, `col2`
-> FROM `tbl`;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
+------+------+
3 rows in set (0.00 sec)
mysql> TRUNCATE TABLE `tbl`;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL `insert_split`('1,2,3,4,5,6,7,8');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `col1`, `col2`
-> FROM `tbl`;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+------+------+
4 rows in set (0.00 sec)
UPDATE
如果使用奇数和偶数值,可以使用以下命令:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.18 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP PROCEDURE IF EXISTS `insert_split`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP FUNCTION IF EXISTS `split_str`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `tbl`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl` (
-> `col1` VARCHAR(255),
-> `col2` VARCHAR(255)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> -- MySQL Split String Function by Federico Cargnelutti
mysql> -- http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
mysql> CREATE FUNCTION `split_str` (
-> `str` TEXT,
-> `delim` CHAR(1),
-> `item` INT UNSIGNED,
-> `max_len_str` SMALLINT UNSIGNED
->) RETURNS VARCHAR(255)
-> BEGIN
-> DECLARE `_current_str` TEXT DEFAULT SUBSTRING_INDEX(`str`, `delim`, `item`);
-> DECLARE `_prev_str` TEXT DEFAULT SUBSTRING_INDEX(`str`, `delim`, `item`-1);
-> IF `_current_str` = `_prev_str` AND CHAR_LENGTH(`_prev_str`) = `max_len_str` THEN
-> RETURN NULL;
-> ELSE
-> RETURN REPLACE(
-> SUBSTRING(
-> `_current_str`,
-> CHAR_LENGTH(`_prev_str`) + 1
-> ),
-> `delim`, '');
-> END IF;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE PROCEDURE `insert_split`(`str` TEXT)
-> BEGIN
-> DECLARE `_max_length_str` SMALLINT UNSIGNED DEFAULT CHAR_LENGTH(`str`);
-> DECLARE `_delim` CHAR(1) DEFAULT ',';
-> DECLARE `_iteration` INT UNSIGNED DEFAULT 0;
-> DECLARE `_odd_value`, `_even_value` VARCHAR(255);
-> `repeat`: LOOP
-> SET `_odd_value` := `split_str`(`str`, `_delim`, `_iteration` + 1, `_max_length_str`);
-> SET `_even_value` := `split_str`(`str`, `_delim`, `_iteration` + 2, `_max_length_str`);
-> IF `_odd_value` IS NULL AND `_even_value` IS NULL THEN
-> LEAVE `repeat`;
-> END IF;
-> INSERT INTO `tbl` (`col1`, `col2`)
-> VALUES (NULLIF(`_odd_value`, ''), NULLIF(`_even_value`, ''));
-> SET `_iteration` := `_iteration` + 2;
-> END LOOP `repeat`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> TRUNCATE TABLE `tbl`;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL `insert_split`('1,2,3,4,5,6');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `col1`, `col2`
-> FROM `tbl`;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
+------+------+
3 rows in set (0.00 sec)
mysql> TRUNCATE TABLE `tbl`;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL `insert_split`('1,2,3,4,5,6,7,8');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `col1`, `col2`
-> FROM `tbl`;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+------+------+
4 rows in set (0.00 sec)
mysql> TRUNCATE TABLE `tbl`;
Query OK, 0 rows affected (0.01 sec)
mysql> CALL `insert_split`(',,,');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `col1`, `col2`
-> FROM `tbl`;
+------+------+
| col1 | col2 |
+------+------+
| NULL | NULL |
| NULL | NULL |
+------+------+
2 rows in set (0.00 sec)
mysql> TRUNCATE TABLE `tbl`;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL `insert_split`(',1,,,3');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `col1`, `col2`
-> FROM `tbl`;
+------+------+
| col1 | col2 |
+------+------+
| NULL | 1 |
| NULL | NULL |
| 3 | NULL |
+------+------+
3 rows in set (0.00 sec)
如果您可以详细说明问题并将预期结果放在您的问题中(例如在代码格式化部分中),那么您应该先自己编写一些代码,然后询问何时卡住 - 请阅读[问]。 – Picard
你可以编写一个函数来分割字符串并返回奇数和偶数值并保存为可重复使用 –