2017-06-02 6 views
0

のStoredProcedureを使用してCSV文字列(VARCHAR(1000)csvString中)MySQLのストアドプロシージャ

csvStringは1,2,3,4,5,6

私のようなテーブルに、このCSV文字列をしたいを持っています

Expected output

以下のCSV文字列は、1,2,3,4,5,6,7,8、その後

Expected output

01であれば

事前に感謝

+0

あなたが問題を詳しく説明し、あなたの質問の中に期待される結果を置くことができれば(例えば、コードの書式設定されたセクションで)、あなたが最初にいくつかのコードを書いて、 [ask]を読んでください。 – Picard

+0

文字列を分割して奇数と偶数の値を返す関数を書くことができます。返信すると –

答えて

0

検証し、必要に応じての調整:

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) 

db-fiddleを参照してください。

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) 

db-fiddleを参照してください。

+0

が動作します。ありがとうたくさん.. – Aakash

+0

私の要求によると、私は11の複数のcsvの文字列を受信されます。そして私は11列にそれを挿入する必要があります。私はそれに応じてロジックを変更するのですが。しかし、ここでは偶数と奇数の値を使うように見えます。 11列論理のための私のためのもう一度行き詰まり。とにかく私はあなたから助けを得ることができます...事前に感謝... – Aakash

+0

@Aakash:更新された答えを参照してください。 – wchiquito

関連する問題