Mysql中substring_index函数实现字符分割一行变多行

 更新时间:2023年12月22日 09:27:12   作者:一个处女座-代码洁癖的程序猿  
在MySQL中,字符串分割是一个常见的操作,本文主要介绍了Mysql中substring_index函数实现字符分割一行变多行,具有一定的参考价值,感兴趣的可以了解一下

问题

有时候我们表里会存在某个字符(例如经常用到的,)分割的分割的数据,但是在使用的时候要将存在字符分割数据拆分,我们一般的做法先从数据库中将数据查询出,在内存中通过字符串分割函数split进行处理,不会在sql中通过函数进行拆分,这也符合阿里的规范,但是如果我们是出报表,通过其他平台写sql的方式进行拆分展示,不经过内存字符串分割,这时候我们只能通过sql 函数substring_index来处理,下面介绍2种方式

解决方案

创建表

create table tb_staff_position_info
(
    id                 varchar(255)                           not null comment '主键'
        primary key,
    created_at         timestamp    default CURRENT_TIMESTAMP not null comment '记录创建时间',
    updated_at         timestamp    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '记录修改时间',
   staff_name    varchar(64)  default ''                not null comment '员工名称',
   position_name    varchar(64)  default ''                not null comment '多个职位以,号分割',
  
)
    comment '员工职位表' charset = utf8;

初始化数据

insert into tb_staff_position_info(staff_name,position_name)values
('小平','技术组长,产品经理,项目经理'),('小花','程序员,测试员,'),('小广‘,'研发总监')

预期查询

查询员工所属的职位,多个职位显示多行

整体思路

1、将position_name 以","号进行拆分,使用mysql 的substring_index(clunm,拆分字符,第几个n) 函数,substring_index函数每次只能获取一个职位

2、借助临时表,从0开始自增,数据中最多有多少个分割字符,临时表就有多少条数据

方案一

借助mysql 的自增表,如下

select 
  info.staff_name,
  substring_index(
        substring_index(
            info.position_name ,
            ',',
            b.n + 1
        ),
        ',' ,- 1
    ) AS position_name
  from tb_staff_position_info info
  join mysql.help_topic b  
on b.help_topic_id < ( length(info.position_name ) - length(REPLACE (info.position_name , ',', ''))  + 1 ) 

临时表借助于mysql的help_topic 表中的 help_topic_id来实现

方案二

有时候查询用户的权限无法访问mysql的表,那么我们也可以创建一个临时表替换,如下所示

select 
  info.staff_name,
  substring_index(
        substring_index(
            info.position_name ,
            ',',
            b.n + 1
        ),
        ',' ,- 1
    ) AS position_name
  from tb_staff_position_info info
  join (
          select 0 as n
          union all 
          select 1 as n
          union all 
          select 2 as n
          ) b 
         on b.n < ( length(info.position_name ) - length(REPLACE (info.position_name , ',', ''))  + 1 )

上述创建的临时表b 最多能匹配 3个分割符,如果存在大于3个那么在将数据插入到临时表即可

方案三

临时表变成正式表,在数据库中创建一张自增表

总结

上述方式各有千秋,下面总结优缺点

优缺点

方法一:

优点:临时表借助mysql 内置的help_topic 表,无需自己创建临时表

缺点:存在查询账号权限的限制,有的账号是无法访问mysql内置表

方法二:

优点:创建自增的临时表不存在权限的限制

缺点:如果分割符存在多个,就要插入多条数据,写法上没有方法一整洁优雅

到此这篇关于Mysql中substring_index函数实现字符分割一行变多行的文章就介绍到这了,更多相关Mysql 字符分割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql建表与索引使用规范详解

    Mysql建表与索引使用规范详解

    本篇文章是对Mysql建表和索引使用规范进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL建表设置默认值的取值范围

    MySQL建表设置默认值的取值范围

    这篇文章主要介绍了MySQL建表设置默认值的取值范围,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • SQL实现对数据库检索数据的直接转换计算

    SQL实现对数据库检索数据的直接转换计算

    这篇文章主要介绍了SQL实现对数据库检索数据的直接转换计算,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • MySQL递归查找树形结构(这个方法太实用了!)

    MySQL递归查找树形结构(这个方法太实用了!)

    对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询,下面这篇文章主要给大家介绍了关于MySQL递归查找树形结构的相关资料,需要的朋友可以参考下
    2022-11-11
  • 与MSSQL对比学习MYSQL的心得(八)--插入 更新 删除

    与MSSQL对比学习MYSQL的心得(八)--插入 更新 删除

    这一篇《与MSSQL对比学习MYSQL的心得(八)》将会讲解MYSQL的插入、更新和删除语句
    2014-08-08
  • Mysql和SQLServer驱动连接的实现步骤

    Mysql和SQLServer驱动连接的实现步骤

    本文主要介绍了Mysql和SQL Server的驱动连接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • MySQL中根据出生日期计算年龄两种方法

    MySQL中根据出生日期计算年龄两种方法

    使用SQL语句计算年龄,在事务处理和日期计算中,较为常见,下面这篇文章主要给大家介绍了关于MySQL中根据出生日期计算年龄的两种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • MySQL Prepared Statement 预处理的操作方法

    MySQL Prepared Statement 预处理的操作方法

    预处理语句是一种在数据库管理系统中使用的编程概念,用于执行对数据库进行操作的 SQL 语句,这篇文章主要介绍了MySQL Prepared Statement 预处理 ,需要的朋友可以参考下
    2024-08-08
  • mysql root密码的重设方法(亲测可用)

    mysql root密码的重设方法(亲测可用)

    这篇文章主要介绍了如何重设mysql root密码,需要的朋友可以参考下
    2014-02-02
  • MySQL使用MD5加密算法进行数据加密功能

    MySQL使用MD5加密算法进行数据加密功能

    在现代的数据库应用中,数据的安全性和隐私性变得尤为重要,MySQL作为最流行的关系型数据库之一,提供了多种加密功能,允许用户对数据进行加密和解密操作,在这篇文章中,我们将深入探讨MySQL的加密功能,并重点介绍如何使用MD5加密算法进行加密,需要的朋友可以参考下
    2024-12-12

最新评论