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

1万+

被折叠的 条评论
为什么被折叠?



