mysql示例:如何从逗号分隔的字符串中取指定位置的值(存储函数、字符串常用函数)

这篇博客介绍了如何在MySQL中利用存储函数和字符串函数高效地从逗号分隔的字符串中提取指定位置的值。文章讨论了多种方法,包括CONCAT, CONCAT_WS, INSERT, REVERSE, SUBSTRING等,并强调了一种优化的方法,该方法不仅适用于逗号,还能兼容其他分隔符。博主还提供了结果演示和相关链接以供参考。" 50468266,5544741,Android 运动传感器详解,"['Android开发', '传感器技术', '移动开发', '硬件交互', '运动检测']

常用的字符串函数方法:

1. CONCAT(a,b...,f)  将a,b...,f连接成字符串,动态语句不可少的函数
2. CONCAT_WS(',',a,b...,f)  将a,b...,f连接成字符串,并用','字符间隔,分隔符可替换为其他分隔符
3. INSERT(str,pos,len,newstr)  返回字符串str,在位置pos起始的子串且len个字符长得子串由字符串newstr代替
4. REVERSE(str)  返回颠倒字符顺序的字符串str
5. SUBSTRING(str,pos,len)  从字符串str返回一个len个字符的子串,从位置pos开始
6. SUBSTRING(str,pos)  从字符串str的起始位置pos返回一个子串。
7. LEFT(str,len)  返回字符串str的最左面len个字符
8. RIGHT(str,len)  返回字符串str的最右面len个字符
9. LOCATE(substr,str)  返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0
10. LOCATE(substr,str,pos)  返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str里面,返回0
11. char_length()  计算长度 把字母,汉字,数字当一个字节处理
12. length()  计算长度 汉字(utf格式)作为三个字节 (gbk格式)作为2个字节,字母和数字为一个字节

13. SUBSTRING_INDEX(str,delim,count)  返回从字符串str的第count个出现的分隔符delim之后的子串。如果count是正数,返回最后的分隔符到左边(从左边数) 的所有字符。如果count是负数,返回最后的分隔符到右边的所有字符(从右边数)。


前言

在实际操作中分割字符串并取值可能会多次用到,因此将其写成存储函数就可多次调用,十分方便,需要注意一点,一些常用的操作都可以写成函数或存储过程。


 像这种具有多组数据的字符串(编号,数量),通过构建存储函数后,便可方便快捷的提取我们想要的编号以及数量(并 转化为int 类型),当然字符串也可能具有多个分隔符,像 '20,200,10,1,50' 这样,我们也能做到有指定性的提取,才更具有实用性。当然我们也可以对照示例创建基于其他分隔符的函数。

一、存储函数

DELIMITER //
DROP FUNCTION IF EXISTS `str_split_int` //
CREATE FUNCTION `str_split_int`(
  in_num INT, # 输入要提取的数是位于字符串中的第几个
  in_rew_str_get CHAR(255) # 输入被提取的字符串
) RETURNS CHAR(255) DETERMINISTIC

BEGIN

  DECLARE lenth SMALLINT DEFAULT 0;
  DECLARE cut_lenth SMALLINT DEFAULT 0;
  DECLARE rew_str VARCHAR(255) DEFAULT '';
  
  # 创建临时表用来存储每段分割的字符
  DROP TEMPORARY TABLE IF EXISTS `ttb_str_cut`;
  CREATE TEMPORARY TABLE `ttb_str_cut` (
    `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增序列号',
    `num_str_cut` SMALLINT(6) NOT NULL DEFAULT '0' COMMENT '字符串每段分隔符所截取的数',
    PRIMARY KEY (`id`)
  ) ENGINE=INNODB DEFAULT CHARSET=utf8;
  
  # 查询字符串的长度
  SET lenth = CHAR_LENGTH(in_rew_str_get),rew_str=in_rew_str_get;
  REPEAT
	# 查询第一段截取下来的字符的长度
	SET cut_lenth=CHAR_LENGTH(SUBSTRING_INDEX(rew_str,',',1));
	# 存储第一段截取下来的字符的长度		
	INSERT INTO ttb_str_cut (num_str_cut) VALUES (SUBSTRING_INDEX(rew_str,',',1));
	# 将截取剩下的字符重新赋值变量中,继续做循环
	SET rew_str=RIGHT(rew_str,lenth-cut_lenth-1);
	SET lenth = CHAR_LENGTH(rew_str);
  UNTIL lenth = 0 END REPEAT;
  RETURN (SELECT num_str_cut FROM ttb_str_cut WHERE id = in_num); # 返回我们要截取的数(int 类型)
END //

以上为错误示范,上述方法展示的是一种实现思路,虽然能实现需求,但过程相对复杂,可供有兴趣的同学对比参考学习,从而寻求更方便直接的函数方法解决问题。下面方法不论从运行时间,代码量,运行空间,过程复杂度都要优化些。此方法除了逗号,其他分隔符也能兼容,囊括性可用性大大增加

DELIMITER //
DROP FUNCTION IF EXISTS `str_split_int01` //
CREATE FUNCTION `str_split_int01`(
  in_num INT, # 输入要提取的数是位于字符串中的第几个
  in_rew_str_get CHAR(255), # 输入被提取的字符串
  in_separt CHAR(32)  # 输入分隔符的格式类型
) RETURNS CHAR(255) DETERMINISTIC

BEGIN
  DECLARE rew_str SMALLINT DEFAULT 0; 
  # 查询字符串的长度
  IF in_num >= 0 THEN
	SET rew_str = SUBSTRING_INDEX(SUBSTRING_INDEX(in_rew_str_get,in_separt,in_num),in_separt,-1);
  END IF;
  IF in_num < 0 THEN
	SET rew_str = SUBSTRING_INDEX(SUBSTRING_INDEX(in_rew_str_get,in_separt,in_num),in_separt,1);
  END IF;

  RETURN rew_str;
END //

二、结果演示

SELECT str_split_int(2,'20,200,10,1,50,80,3',',');

# ------------------------两种调用示例

SELECT str_split_int01(-3,'20|200|10|1|50','|');

创建好的函数便可当作普通函数方法使用即可。

总结

博主推荐链接:https://blog.csdn.net/weixin_42825317/article/details/119279330

本文为示例方法,可供参考,具体需求还需具体分析,如有意见和问题,欢迎评论区留言

如有帮助到你,帮忙点个关注。如有侵权请私信删除

转载请标注原文出处链接:mysql示例:如何从逗号分隔的字符串中取指定位置的值(存储函数、字符串常用函数)_hz丶长鹿manman的博客-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值