【0】需求 【0.1】需求描述 数据库中 num字段值为: 实现的效果:需要将一行数据变成多行 【0.2】实现的SQL
1 2 3 4 5 6 |
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1 |
涉及的知识点 【1】字符串拆分: SUBSTRING_INDEX(str, delim, count) 参数解说 解释 str 需要拆分的字符串 delim 分隔符,通过某字符进行拆分 count 当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n 个分隔符之后的所有字符。 举例
1 2 3 4 5 |
(1)获取第2个以逗号为分隔符之前的所有字符。 SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',2); <img class="medium-zoom-image" src="https://img2020.cnblogs.com/blog/1302413/202102/1302413-20210223175157464-1078941390.png" alt="" data-mce-src="https://img2020.cnblogs.com/blog/1302413/202102/1302413-20210223175157464-1078941390.png"> |
1 2 3 |
(2)获取最后一个到倒数第2个以逗号分隔符之后的所有字符 SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',-2); |
所以,我们的核心代码中的 -1 ,就是获取以逗号为分隔符的最后一个值;也就是7788 【2】替换函数:replace( str, from_str, to_str) 参数名 解释 str 需要进行替换的字符串 from_str 需要被替换的字符串 to_str 需要替换的字符串 2. 举例
1 2 3 |
(1)将分隔符逗号替换为空。 SELECT REPLACE('7654,7698,7782,7788',',',''); |
【3】获取字符串长度:LENGTH( str ) 参数名 解释 str 需要计算长度的字符串 举例
1 2 3 4 |
(1)获取 ‘7654,7698,7782,7788’ 字符串的长度 SELECT LENGTH('7654,7698,7782,7788') <img src="https://img2020.cnblogs.com/blog/1302413/202102/1302413-20210223175618490-72037422.png" alt="" data-mce-src="https://img2020.cnblogs.com/blog/1302413/202102/1302413-20210223175618490-72037422.png"> |
【4】实现的原理解析 【4.0】实现SQL 需要解析的SQL
1 2 3 4 5 6 |
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1 |
此处利用 mysql 库的 help_topic 表的 help_topic_id 来作为变量,因为 help_topic_id 是自增的,当然也可以用其他表的自增字段辅助。 help_topic 表: 注意,这个辅助表的ID最大长度只有642;如果过长的字符串,可能需要借助其他自增的辅助表(可以是现有表,也可以自己造一个 1,2,3,4 递增的行即可) […]
View Details