mysql根據分隔符將一行數據拆分成多行數據
關鍵函數
substring_index(str,delim,count)
str:要處理的字符串
delim:分隔符
count:計數
例子:str=f.s.z
substring_index(str,’.’,1)
結果是:f
substring_index(str,’.’,2)
結果是:f.s
也就是說,如果count是正數,那麼就是從左往右數,第N個分隔符的左邊的全部內容
相反,如果是負數,那麼就是從右邊開始數,第N個分隔符右邊的所有內容,如:
substring_index(str,’.’,-2)
結果爲:s.z
有人會問,如果我要中間的的s怎麼辦?
很簡單的,兩個方向:
從右數第二個分隔符的右邊全部,再從左數的第一個分隔符的左邊:
substring_index(substring_index(str,’.’,-2),’.’,1);
原始數據
處理結果展示
三種方式,相同的原理
SELECT
a.id,
a.email,
substring_index(
substring_index(
a.name,
',',
b.help_topic_id + 1
),
',' ,- 1
) AS splitName
FROM
t_emp a
JOIN mysql.help_topic b ON b.help_topic_id < (
length(a.name) - length(
REPLACE (a.name, ',', '')
) + 1
)
CREATE TABLE `auto_increment` (
`id` int(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `auto_increment` VALUES ('0');
INSERT INTO `auto_increment` VALUES ('1');
INSERT INTO `auto_increment` VALUES ('2');
INSERT INTO `auto_increment` VALUES ('3');
INSERT INTO `auto_increment` VALUES ('4');
SELECT
a.id,
a.email,
substring_index(
substring_index(
a.name,
',',
b.id+ 1
),
',' ,- 1
) AS splitName
FROM
t_emp a
JOIN auto_increment b ON b.id < (
length(a.name) - length(
REPLACE (a.name, ',', '')
) + 1
)
SELECT
a.id,
a.email,
substring_index(
substring_index(
a.name,
',',
b.id+1
),
',',-1
) AS splitName
FROM
t_emp a
join
(
SELECT
(
@ROW :=@Row + 1
) AS id
FROM
t_user,
(
SELECT @Row:=-1
) AS zz
) AS b ON b.id < (
length(a.name) - length(
replace(a.name,',','')
) + 1
)
ORDER BY a.id
t_user表是庫裏已有表(可以不是序列表),行數必須大於分割字段的最大逗號數
小結
-
序列表必須從0開始,行數與最多的逗號個數有關,行數至少比最長逗號個數加1,可以建0~1000。(其實也可以不從0開始,但是sql語句要做相對應的修改)
-
爲什麼不用MySQL自帶的自增序列表mysql.help_topic?因爲好多公司的數據庫是沒有權限操作這些表的, 不能使用。
-
序列表必須從0開始,行數與最多的逗號個數有關,行數至少比最長逗號個數加1,可以建0~1000。(其實也可以不從0開始,但是sql語句要做相對應的修改)
-
爲什麼不用MySQL自帶的自增序列表mysql.help_topic?因爲好多公司的數據庫是沒有權限操作這些表的, 不能使用。