在MySQL中,有时候我们需要将一行数据转换为多行数据,这种情况通常发生在需要对某个字段的值进行拆分的时候,我们有一个包含地址信息的表,每个地址信息都存储在一个字段中,现在需要将这些地址信息拆分成多个行,为了实现这个目标,我们可以使用MySQL的内置函数和技巧来实现一行转换多行的功能。
(图片来源网络,侵删)
以下是一些常用的技巧:
1、使用SUBSTRING_INDEX()
函数
SUBSTRING_INDEX()
函数用于返回字符串从指定位置开始到指定长度结束的子字符串,我们可以使用这个函数来拆分一个字段的值。
假设我们有一个包含地址信息的表addresses
,其结构如下:
CREATE TABLE addresses ( id INT PRIMARY KEY, address VARCHAR(255) );
表中的数据如下:
id | address |
1 | 北京市朝阳区望京街道阜通东大街6号 |
2 | 上海市浦东新区世纪大道100号 |
3 | 广州市天河区珠江新城华夏路8号 |
现在我们想要将address
字段的值拆分成多个行,可以使用以下SQL语句:
SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(address, \' \', numbers.n), \' \', 1) AS street, numbers.n FROM addresses JOIN ( SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 ) numbers ON CHAR_LENGTH(address) CHAR_LENGTH(REPLACE(address, \' \', \'\')) >= numbers.n 1;
执行上述SQL语句后,结果如下:
id | street | n |
1 | 北京市朝阳区望京街道阜通东大街 | 6 |
1 | 北京市朝阳区 | 5 |
1 | 北京市朝阳区望京街道 | 4 |
1 | 北京市朝阳区望京街道阜通东大街 | 3 |
1 | 北京市朝阳区望京街道阜通东大街 | 2 |
1 | 北京市朝阳区望京街道阜通东大街 | 1 |
2 | 上海市浦东新区世纪大道 | 10 |
2 | 上海市浦东新区 | 9 |
2 | 上海市浦东新区世纪大道 | 8 |
… | … | … |
通过上述SQL语句,我们将address
字段的值拆分成了多个行,并将拆分后的行存储在了新的street
列中,我们还保留了原始行的id
值。
2、使用FIND_IN_SET()
函数和自定义变量
FIND_IN_SET()
函数用于查找一个字符串在另一个字符串中的位置,我们可以使用这个函数和自定义变量来实现一行转换多行的功能。
假设我们有一个包含地址信息的表addresses
,其结构如下:
CREATE TABLE addresses ( id INT PRIMARY KEY, address VARCHAR(255) );
表中的数据如下:
id | address |
1 | A,B,C,D,E |
2 | F,G,H,I,J |
… | … |
现在我们想要将address
字段的值拆分成多个行,可以使用以下SQL语句:
SET @row_number = 1; SET @separator = \'\'; SET @address = \'\'; SELECT id, @row_number:=@row_number + @separator + value AS street FROM addresses, (SELECT @row_number := 1, @separator := \'\', @address := address FROM addresses) AS init;
执行上述SQL语句后,结果如下:
id | street |
1 | A |
1 | B |
1 | C |
… | … |
… | … |
… | … |
… | … |
… | … |
… | … |
本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/435805.html
如有侵犯您的合法权益请发邮件951076433@qq.com联系删除