Mysql行转列把逗号分隔的字段拆分成多行两种方法

 更新时间:2024年05月29日 10:54:57   作者:技术武器库  
在数据库中有时候我们需要将一些行数据转换为列数据,这在处理数据透视表、报表生成等场景下非常常见,这篇文章主要给大家介绍了关于Mysql行转列把逗号分隔的字段拆分成多行的两种方法,需要的朋友可以参考下

效果如下

源数据

变更后的数据

方法

第一种

先执行下面的SQL,看不看能不能执行,如果有结果,代表数据库版本是可以的,可以看下面和自己表关联的SQL,如果不行用第二种。

示例SQL

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

和业务结合在一起使用

SELECT
		a.store_signer_name,
		substring_index( substring_index( a.concatStoreId, ',', b.help_topic_id + 1 ), ',', - 1 ) AS concatStoreId 
	FROM
		(select store_signer_nameconcatStoreId from test) a
		INNER JOIN mysql.help_topic b ON b.help_topic_id < (
			length( a.concatStoreId ) - length(
			REPLACE ( a.concatStoreId, ',', '' )) + 1)

其核心在于mysql.help_topic,但是版本太低的数据库版本不支持,如果不支持,可以用下面第二种。

第二种

示例SQL

SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(table_name.csv_values, ',', numbers.n), ',', -1) AS split_value
FROM
  table_name
  INNER JOIN
  (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL
   SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL
   SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL
   SELECT 29 UNION ALL SELECT 30 UNION ALL SELECT 31 UNION ALL SELECT 32 UNION ALL SELECT 33 UNION ALL SELECT 34 UNION ALL SELECT 35 UNION ALL SELECT 36 UNION ALL SELECT 37 UNION ALL
   SELECT 38 UNION ALL SELECT 39 UNION ALL SELECT 40) numbers
  ON CHAR_LENGTH(table_name.csv_values) - CHAR_LENGTH(REPLACE(table_name.csv_values, ',', '')) >= numbers.n - 1;

在上面的查询中,因为我逗号分隔的最大个数是36,所以我添加了40个UNION ALL SELECT子句,以生成数字序列1到40。你可以根据需要调整这个序列的长度。

请注意,如果你的逗号分隔值个数大于40,那么你需要相应地增加数字序列的长度。

和业务结合在一起使用

SELECT
table_name.store_signer_name,
table_name.store_signer_contact,
  SUBSTRING_INDEX(SUBSTRING_INDEX(table_name.concatStoreId, ',', numbers.n), ',', -1) AS store_id
FROM
  (select store_signer_name,store_signer_contact,GROUP_CONCAT(store_id) concatStoreId from t_store_esgin_info where business_status = 1003 and type =0 and start_year = 2023  group by store_signer_name,store_signer_contact having count(1) > 1) table_name
  INNER JOIN
  (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL
   SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL
   SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL
   SELECT 29 UNION ALL SELECT 30 UNION ALL SELECT 31 UNION ALL SELECT 32 UNION ALL SELECT 33 UNION ALL SELECT 34 UNION ALL SELECT 35 UNION ALL SELECT 36 UNION ALL SELECT 37 UNION ALL
   SELECT 38 UNION ALL SELECT 39 UNION ALL SELECT 40) numbers
  ON CHAR_LENGTH(table_name.concatStoreId) - CHAR_LENGTH(REPLACE(table_name.concatStoreId, ',', '')) >= numbers.n - 1;

结论

如果Mysql版本较低,使用第二种,如果可以执行第一种示例SQL,那么推荐使用第一种,动态的。

到此这篇关于Mysql行转列把逗号分隔的字段拆分成多行的两种方法的文章就介绍到这了,更多相关Mysql逗号分隔字段拆分多行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问

    MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问

    这篇文章主要介绍了MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问,本文讲解了FEDERATED存储引擎的描述、安装与启用FEDERATED存储引擎、准备远程服务器环境等内容,需要的朋友可以参考下
    2014-10-10
  • 一篇文章带你了解SQL之CASE WHEN用法详解

    一篇文章带你了解SQL之CASE WHEN用法详解

    本文介绍下,在mysql数据库中,有关case when语句的用法,介绍了case when语句的基础知识,并提供了相关实例,供大家学习参考,有需要的朋友不要错过
    2021-08-08
  • MySQL处理重复数据完整代码实例

    MySQL处理重复数据完整代码实例

    在数据库管理中,查找重复值是一项常见需求,下面这篇文章主要介绍了MySQL处理重复数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • MySQL将多条数据合并成一条的完整代码示例

    MySQL将多条数据合并成一条的完整代码示例

    我们在操作数据的时候,有时候需要把多行数据,拼接成一行,下面这篇文章主要给大家介绍了关于MySQL将多条数据合并成一条的完整代码示例,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • phpstudy无法启动MySQL服务的完美解决办法

    phpstudy无法启动MySQL服务的完美解决办法

    学习php当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境,一键安装对新手很友好,下面这篇文章主要给大家介绍了关于phpstudy无法启动MySQL服务的完美解决办法,需要的朋友可以参考下
    2022-06-06
  • 深入讲解MySQL事务的ACID特性、隔离级别、实现原理及锁机制

    深入讲解MySQL事务的ACID特性、隔离级别、实现原理及锁机制

    本文深入讲解MySQL事务的ACID特性、隔离级别、实现原理及锁机制,探讨事务的原子性、一致性、隔离性和持久性,分析不同隔离级别的优劣,详解redolog、undolog、MVCC及行锁算法
    2026-01-01
  • MYSQL基础之连接MYSQL、修改密码、添加用户

    MYSQL基础之连接MYSQL、修改密码、添加用户

    在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。
    2008-08-08
  • MySQL触发器的应用示例详解

    MySQL触发器的应用示例详解

    这篇文章主要介绍了MySQL触发器的应用,触发器是与MySQL数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,需要的朋友可以参考下
    2022-08-08
  • MySQL 5.6主从报错的实战记录

    MySQL 5.6主从报错的实战记录

    这篇文章主要给大家介绍了关于MySQL 5.6主从报错的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MySQL FLOAT不准问题解析

    MySQL FLOAT不准问题解析

    在数据库处理中,使用FLOAT类型存储浮点数时,由于二进制表示的限制,会导致精度损失,解决方法包括使用DOUBLE或DECIMAL类型来提高精度,或避免使用浮点数进行精确计算,感兴趣的可以了解一下
    2024-09-09

最新评论