mysql怎么返回一个字段逗号分隔后的所有数据的sql

mysql怎么返回一个字段逗号分隔后的所有数据的sql

场景描述

mysql有一张表比如result表,表中有个字段场景id:scene_id,这个id存储的值可以是单个的id也可以是多个id用逗号拼接起来的,现在需要查询总共有多少个场景。 需要对场景id进行分割然后去重

5.7版本MySql : 完整sql如下

	SELECT
	distinct
	substring_index( substring_index( pd.scene_id, ',', b.help_topic_id + 1 ), ',', - 1 ) AS split_value
	FROM result pd
	INNER JOIN mysql.help_topic b 
	ON b.help_topic_id < ( length( pd.scene_id ) - length( REPLACE ( pd.scene_id, ',', '' )) + 1 )

sql解析

mysql.help_topic是 MySQL 数据库自带的一个系统表,其中比较关键的是help_topic_id列,这是一个自增的整数列,用于唯一标识每个帮助主题条目

b.help_topic_id 返回的是从0开始到b.help_topic_id < length

substring_index( pd.scene_id, ‘,’, b.help_topic_id + 1 ) 截取的是第b.help_topic_id + 1逗号前面的值

substring_index( substring_index( pd.scene_id, ‘,’, b.help_topic_id + 1 ), ‘,’, - 1 ) 截取的是第b.help_topic_id + 1逗号前面的值,的基础上逗号分隔后的最后一个值

8.0 版本MySql : 完整sql如下

SELECT split_value
FROM (
         SELECT REGEXP_SPLIT_TO_TABLE(your_column_name, ',') AS split_value
         FROM result
         WHERE some_condition
     ) AS subquery;
### 如何在 MySQL 中实现字段分割 #### 使用内置函数 `SUBSTRING_INDEX` 对于简单的字符串分割操作,可以利用 MySQL 的内置函数 `SUBSTRING_INDEX` 来完成。此函数允许指定分隔符以及要获取的部分数量。 例如,假设有一个名为 `users`,其中有一列 `email` 存储电子邮件地址,现在想要提取邮箱域名部分: ```sql SELECT SUBSTRING_INDEX(email, '@', -1) AS domain FROM users; ``` 这条语句会返回每条记录中的 email 地址后面紧跟 @ 符号之后的内容作为新的域名为 'domain' 的字段[^1]。 #### 自定义存储过程或函数处理复杂情况 当面对更复杂的场景时——比如需要按照逗号或其他特殊符号来拆分一整个列形式的数据项,则可能需要用到自定义 SQL 函数或者通过创建临时格的方式来解决问题。下面是一个例子展示如何编写一个用于按特定分隔符切割输入字符串并将其转换成行集的函数: ```sql DELIMITER $$ CREATE FUNCTION SPLIT_STR( x VARCHAR(255), delim VARCHAR(12), pos INT ) RETURNS VARCHAR(255) DETERMINISTIC BEGIN RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, ''); END$$ DELIMITER ; ``` 上述代码定义了一个叫做 `SPLIT_STR()` 的新函数,它接受三个参数:待切分的原始字符串 (`x`)、分隔符(`delim`) 和目标位置(`pos`) 。该函数能够帮助定位到由给定分隔符划分出来的第 n 部分的具体内容。 另外,在某些情况下还可以考虑使用 FIND_IN_SET() 函数配合其他逻辑达式一起工作,特别是当你知道数据是以逗号分隔的情况下。不过需要注意的是,FIND_IN_SET 只适用于以英文半角逗号 `,` 进行分隔的情况,并且其第二个参数应当是由这些逗号连接而成的一系列组成的集合[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值