Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pisahkan string dan loop melalui nilai-nilai dalam Prosedur MySql

Anda harus sedikit lebih berhati-hati dengan manipulasi string Anda. Anda tidak dapat menggunakan REPLACE() untuk ini, karena itu akan menggantikan beberapa kemunculan, merusak data Anda jika satu elemen dalam daftar yang dipisahkan koma adalah substring dari elemen lain. INSERT() fungsi string lebih baik untuk ini, jangan bingung dengan INSERT pernyataan yang digunakan untuk menyisipkan ke dalam tabel.

DELIMITER $$

DROP PROCEDURE IF EXISTS `insert_csv` $$
CREATE PROCEDURE `insert_csv`(_list MEDIUMTEXT)
BEGIN

DECLARE _next TEXT DEFAULT NULL;
DECLARE _nextlen INT DEFAULT NULL;
DECLARE _value TEXT DEFAULT NULL;

iterator:
LOOP
  -- exit the loop if the list seems empty or was null;
  -- this extra caution is necessary to avoid an endless loop in the proc.
  IF CHAR_LENGTH(TRIM(_list)) = 0 OR _list IS NULL THEN
    LEAVE iterator;
  END IF;
 
  -- capture the next value from the list
  SET _next = SUBSTRING_INDEX(_list,',',1);

  -- save the length of the captured value; we will need to remove this
  -- many characters + 1 from the beginning of the string 
  -- before the next iteration
  SET _nextlen = CHAR_LENGTH(_next);

  -- trim the value of leading and trailing spaces, in case of sloppy CSV strings
  SET _value = TRIM(_next);

  -- insert the extracted value into the target table
  INSERT INTO t1 (c1) VALUES (_value);

  -- rewrite the original string using the `INSERT()` string function,
  -- args are original string, start position, how many characters to remove, 
  -- and what to "insert" in their place (in this case, we "insert"
  -- an empty string, which removes _nextlen + 1 characters)
  SET _list = INSERT(_list,1,_nextlen + 1,'');
END LOOP;

END $$

DELIMITER ;

Selanjutnya, tabel untuk pengujian:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tabel baru kosong.

mysql> SELECT * FROM t1;
Empty set (0.00 sec)

Panggil prosedurnya.

mysql> CALL insert_csv('foo,bar,buzz,fizz');
Query OK, 1 row affected (0.00 sec)

Perhatikan bahwa "1 baris terpengaruh" tidak berarti apa yang Anda harapkan. Ini mengacu pada penyisipan terakhir yang kami lakukan. Karena kita menyisipkan satu baris pada satu waktu, jika prosedur menyisipkan setidaknya satu baris, Anda akan selalu mendapatkan jumlah baris 1; jika prosedur tidak memasukkan apa pun, Anda akan mendapatkan 0 baris yang terpengaruh.

Berhasil?

mysql> SELECT * FROM t1;
+----+------+
| id | c1   |
+----+------+
|  1 | foo  |
|  2 | bar  |
|  3 | buzz |
|  4 | fizz |
+----+------+
4 rows in set (0.00 sec)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghapus dari beberapa tabel di MySQL?

  2. Tentukan file konfigurasi MySQL mana yang digunakan

  3. Java:Masukkan beberapa baris ke MySQL dengan PreparedStatement

  4. Datetime sama atau lebih besar dari hari ini di MySQL

  5. MySQL Ubah Kata Sandi Pengguna