mysql字符串拆分为列数据
有些时候,我们需要把字符串行转为列,这时候我们可以通过mysql.help_topic表来协助操作,help_topic_id 是从零开始的整数自增列。
mysql.help_topic表是数据库mysql下的一个表,可以用 desc help_topic
命令看到表的定义;
需要注意的是,转为的列数据的行数不得超过mysql.help_topic.help_topic_id的最大值;也可用用其他从0开始的整数自增列(中间不能有跳跃)来代替此字段;
例:把“广东,江西,海南,湖南,安徽” 字符串拆分为列数据;
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(a.addr,',',b.help_topic_id+1),',',-1) as addr
FROM (SELECT '广东,江西,海南,湖南,安徽' as addr) a
JOIN mysql.help_topic b on b.help_topic_id<(LENGTH(a.addr)-LENGTH(REPLACE(a.addr,',',''))+1)
结果
说明
- 如果字符串最后也有一个逗号,则会额外多拆出来一个空字符串列,这时可以把on条件后面的+1给去掉;
解析
SUBSTRING_INDEX(str,delim,count)
- str 是字符串,这里是 addr ; delim 是分隔符,这里是逗号;count是计数。
- 返回 字符串str的第count 出现的分隔符的之前(后)的数据;
- 如果count 是正数,则是返回第 count 个字符左边的字符串(从左往右)。
- 如果count 是负数,则是返回第 (number 的绝对值)个字符右边的字符串(从右往左)。
示例:
SELECT SUBSTRING_INDEX("广东,江西,海南,湖南,安徽",',',2)
结果是 广东,江西
``SELECT SUBSTRING_INDEX(“广东,江西,海南,湖南,安徽”,’,’,-2)`
结果是 湖南,安徽
这里是采用先取左列数据,再取右边第一个数据,就可以得到第N个数据;
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX("广东,江西,海南,湖南,安徽",',',2),',',-1)
结果是 江西
length(str)函数
- length()函数用于获取字符串的长度;
- 一个汉字算3个字符,一个数字或字母算一个字符;
示例:
SELECT LENGTH("广东,江西")
结果是13。
replace(a,b,c)
- 将字符串a中的b 替换为c;
- a,b,c 均为字符串;
示例:
SELECT replace("广东,江西,海南,湖南,安徽",",","、")
结果是 广东、江西、海南、湖南、安徽
扩展应用:查询 某段日期 的列数据;
select date_format(date_sub('2021-07-12', interval help_topic_id day),'%Y-%m-%d') as dates
from mysql.help_topic
where help_topic_id<=DATEDIFF('2021-07-12','2021-06-01') ;
结果
说明
- 这条语句经常用于 查询很长一段日期的统计数据,如某段时间内每天的消费数据。由于存在意外情况,某天可能没数据,但是也是要展示,可以用这条语句查询 作为主表来left join;
- 注意,不能超过help_topic 表1000行的上限,不过普通查询中应该够用了!
解析
date_sub (date,INTERVAL expr type) 函数
- date是日期,expr是 时间间隔,type是时分秒日周月年等,详见MySQL DATE_SUB() 函数用法 ,这里不再解释了;
示例:
SELECT date_sub('2021-07-12', interval 2 day);
结果是 2021-07-10
date_format(date,format)
- date 日期,format 是格式,年月日 是 ‘%Y-%m-%d’。其余字段详见 MySQL DATE_FORMAT() 函数
示例:
SELECT DATE_FORMAT(CURRENT_DATE(),"%Y-%m-%d %H:%i:%s")
DATEDIFF(date1,date2)
- date1和date2 是日期,返回 date1 和date2 之间的天数,即 date1-date2 的天数;
示例:
SELECT DATEDIFF('2021-07-12','2021-07-10')
结果是 2