MySQL根据特定符号切割字段的字符串
现有一个finger表,表中有一个字段“work_week_day”,为varchar类型的,表示工作日,例如:1,2,3,4,5 就表示 周1——周5现在需要将1,2,3,4,5分割拿出来直接上SQL语句如下:-- 分割字符串SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(f.work_week_day, ',', help_topic_id + 1), ',',
现有一个finger表,表中有一个字段“work_week_day”,为varchar类型的,表示工作日,例如:1,2,3,4,5 就表示 周1——周5
现在需要将1,2,3,4,5分割拿出来
直接上SQL语句如下:
-- 分割字符串
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(f.work_week_day, ',', help_topic_id + 1), ',', -1) AS weekDay
FROM finger AS f
JOIN mysql.help_topic
ON help_topic_id < LENGTH(f.work_week_day) - LENGTH(REPLACE(f.work_week_day, ',' , '')) + 1
查询结果如下所示:
涉及的知识点:
1、字符串拆分: SUBSTRING_INDEX(str, delim, count)
- str 需要拆分的字符串
- delim 分隔符,通过某字符进行拆分
- count 当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n个分隔符之后的所有字符。
举例子:
1)获取第2个以逗号为分隔符之前的所有字符
2)获取最后一个到倒数第2个以逗号分隔符之后的所有字符
所以,我们最开始的SQL中的 -1 ,就是获取以逗号为分隔符的最后一个值;也就是5
2、替换函数:REPLACE( str, from_str, to_str)
- str 需要进行替换的字符串
- from_str 需要被替换的字符串
- to_str 需要替换的字符串
举例子:
1)将分隔符逗号替换为空隔
3、获取字符串长度:LENGTH(str)
举例子:
1)获取 '123,456,789,000'字符串的长度
重点 :
本次利用 MySQL库的 help_topic 表的 help_topic_id 来作为变量,因为 help_topic_id 是自增的,当然也可以用其他表的自增字段辅助。
我们来看看其表结构:
其id为自增的
注意!!这个辅助表的id最大长度只有642;如果过长的字符串,可能需要借助其他自增的辅助表(可以是现有表,也可以自己造一个 1,2,3,4 递增的行即可)
原理解析:
Step1:首先获取最后需被拆分成多少个字符串,利用 help_topic_id 来模拟遍历 第n个字符串。
也就是代码段:
help_topic_id < LENGTH(f.work_week_day) - LENGTH(REPLACE(f.work_week_day, ',' , '')) + 1
下面我们来分步解析上面SQL
①截取第一段,得到字符串 ‘1,2,3,4,5’ 的长度是9
②截取第二段,得到去除 ' , ' 后的字符串长度是5
9 - 5 = 4。
说明什么?是不是说明有4个 逗号,那就说明有5个字符串需要被分割!
也就是 help_topic_id < 5
因为help_topic_id也是从0开始的,也就是说help_topic_id 是 [0 1 2 3 4]
即:有5行数据
Step2:根据“,”逗号来拆分字符串,此处利用 SUBSTRING_INDEX(str, delim, count) 函数,最后把结果赋值给 weekDay字段。
也就是下面这段代码:
SUBSTRING_INDEX(SUBSTRING_INDEX(f.work_week_day, ',', help_topic_id + 1), ',', -1) AS weekDay
待截取的字符串:‘1,2,3,4,5’
1)
以”,”逗号为分隔符,根据 help_topic_id 的值来截取第n+1个分隔符之前所有的字符串。 (此处 n+1 是因为help_topic_id 是从0开始算起,而此处需从第1个分隔符开始获取。)
例如:
当 help_topic_id = 0时,获取到的字符串 = 1
当 help_topic_id = 1时,获取到的字符串 = 1,2
…(以此类推)
2)
以”,”逗号为分隔符,截取倒数第1个分隔符之后的所有字符串。也就是最后一个数字:5
最终的效果也就是我们最开始看到的结果!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)