mysql字符串拆分为列数据


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)

示例:

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


文章作者: 洛神葵
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 洛神葵 !
评论
  目录