MySQL 在一列中按分号拆分,每次拆分形成一个新行
MySQL split on semicolon in a column to form a new row for each split
所以我得到了遗留 mysql 数据库,其中的数据如下所示:
DATE | DATA
2015-04-27 | sample; sample2; sample3
2015-04-28 | sample1; sample4
我想创建一个新的 table 来存储 date/data 对。
DATE | DATA
2015-04-27 | sample
2015-04-27 | sample2
2015-04-27 | sample3
2015-04-28 | sample1
2015-04-28 | sample4
我试过查看用户定义的拆分函数,但它们似乎都只想拆分一个 char 和 return 一个拆分实例。我需要保留所有实例以放入新的 table。
所以使用这个:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
我创建了拆分函数并尝试更改 return:
REPLACE(SUBSTRING(SUBSTRING_INDEX(list, ';'),
LENGTH(SUBSTRING_INDEX(list, ';', pos -1)) + 1),
delim, '')
但是它需要第三个参数来指定你想要哪个实例return。有没有办法 return 新行的所有实例都带有左列的日期?
这是一个想法...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
( date DATE NOT NULL
, data VARCHAR(100) NOT NULL
);
INSERT INTO my_table VALUES
('2015-04-27','sample; sample2; sample3'),
('2015-04-28','sample1; sample4');
SELECT * FROM my_table;;
+------------+--------------------------+
| date | data |
+------------+--------------------------+
| 2015-04-27 | sample; sample2; sample3 |
| 2015-04-28 | sample1; sample4 |
+------------+--------------------------+
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT DISTINCT date
, data
, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(data,';',i+1),';',-1)) x
FROM ints
, my_table
ORDER
BY date,i;
+------------+--------------------------+---------+
| date | data | x |
+------------+--------------------------+---------+
| 2015-04-27 | sample; sample2; sample3 | sample |
| 2015-04-27 | sample; sample2; sample3 | sample2 |
| 2015-04-27 | sample; sample2; sample3 | sample3 |
| 2015-04-28 | sample1; sample4 | sample1 |
| 2015-04-28 | sample1; sample4 | sample4 |
+------------+--------------------------+---------+
所以我得到了遗留 mysql 数据库,其中的数据如下所示:
DATE | DATA
2015-04-27 | sample; sample2; sample3
2015-04-28 | sample1; sample4
我想创建一个新的 table 来存储 date/data 对。
DATE | DATA
2015-04-27 | sample
2015-04-27 | sample2
2015-04-27 | sample3
2015-04-28 | sample1
2015-04-28 | sample4
我试过查看用户定义的拆分函数,但它们似乎都只想拆分一个 char 和 return 一个拆分实例。我需要保留所有实例以放入新的 table。
所以使用这个:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
我创建了拆分函数并尝试更改 return:
REPLACE(SUBSTRING(SUBSTRING_INDEX(list, ';'),
LENGTH(SUBSTRING_INDEX(list, ';', pos -1)) + 1),
delim, '')
但是它需要第三个参数来指定你想要哪个实例return。有没有办法 return 新行的所有实例都带有左列的日期?
这是一个想法...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
( date DATE NOT NULL
, data VARCHAR(100) NOT NULL
);
INSERT INTO my_table VALUES
('2015-04-27','sample; sample2; sample3'),
('2015-04-28','sample1; sample4');
SELECT * FROM my_table;;
+------------+--------------------------+
| date | data |
+------------+--------------------------+
| 2015-04-27 | sample; sample2; sample3 |
| 2015-04-28 | sample1; sample4 |
+------------+--------------------------+
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT DISTINCT date
, data
, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(data,';',i+1),';',-1)) x
FROM ints
, my_table
ORDER
BY date,i;
+------------+--------------------------+---------+
| date | data | x |
+------------+--------------------------+---------+
| 2015-04-27 | sample; sample2; sample3 | sample |
| 2015-04-27 | sample; sample2; sample3 | sample2 |
| 2015-04-27 | sample; sample2; sample3 | sample3 |
| 2015-04-28 | sample1; sample4 | sample1 |
| 2015-04-28 | sample1; sample4 | sample4 |
+------------+--------------------------+---------+