首先,大家要知道的是,在mysql中并没有split函数,需要自己写。
比如下面几个mysql split函数的例子。
例1,获得按指定字符分割的字符串的个数:
复制代码 代码示例:
DELIMITER $$
DROP FUNCTION IF EXISTS `sims`.`func_get_split_string_total`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `func_get_split_string_total`(
f_string varchar(1000),f_delimiter varchar(5)
) RETURNS int(11)
BEGIN
declare returnInt int(11);
if length(f_delimiter)=2 then
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')))/2;
else
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
end if;
END$$
DELIMITER ;
调用:
func_get_split_string_total('abc||def||gh','||')
结果为3
例2,得到第i个分割后的字符串。
复制代码 代码示例:
DELIMITER $$
DROP FUNCTION IF EXISTS `sims`.`func_get_split_string`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `func_get_split_string`(
f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END$$
DELIMITER ;
调用:func_get_split_string('abc||def||gh','||',2)
结果为def
例3,需求:A表中的一个字段值为1||2, 在select 时要通过和B字典表的关联得到a,b
复制代码 代码示例:
CREATE DEFINER=`root`@`localhost` FUNCTION `getDictName`(v_str varchar(100)) RETURNS varchar(100) CHARSET utf8
BEGIN
DECLARE i int(4);
DECLARE dictCode varchar(100);
DECLARE dictName varchar(100);
DECLARE returnStr varchar(100);
set i = 1;
set returnStr = '';
if(v_str is null or length(v_str)=0) then
return returnStr;
else
while i<=func_get_split_string_total(v_str,'||')
do
set dictCode = func_get_split_string(v_str,'||',i);
select names into dictName from sims_dd_dict where code = dictCode;
set returnStr = concat(returnStr,',',dictName); -- 这里要用中文的逗号,否则
导出excel的时候会串行,因为程序中是以逗号分隔的
set i = i+1; ---//(
脚本学堂 www.jb200.com 编辑整理)
end while;
set returnStr = subString(returnStr,2);
return returnStr;
end if;
END$$
在mysql数据库中使用split,有时要考虑接收返回值的问题,下面来看两个例子。
例1,mysql使用split接收返回值。
复制代码 代码示例:
DELIMITER $$;
DROP FUNCTION IF EXISTS `func_getSplitCount`$$
CREATE FUNCTION `func_getSplitCount`(
f_string varchar(1000),f_delimit varchar(5)
) RETURNS int(11)
BEGIN
return 1+(length(f_string) - length(replace(f_string,f_delimit,'')));
END$$
DELIMITER ;$$
DELIMITER $$; DROP FUNCTION IF EXISTS `func_getSplitCount`$$ CREATE FUNCTION `func_getSplitCount`( f_string varchar(1000),f_delimit varchar(5) ) RETURNS int(11) BEGIN return 1+(length(f_string) - length(replace(f_string,f_delimit,''))); END$$ DELIMITER ;$$
例2:
复制代码 代码示例:
DELIMITER $$;
DROP FUNCTION IF EXISTS `func_getSplitString`$$
CREATE FUNCTION `func_getSplitString`(
f_string varchar(1000),f_delimit varchar(5),f_order int
) RETURNS varchar(255)
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimit,f_order)),f_delimit,1));
return result;
END$$
DELIMITER ;$$
DELIMITER $$; DROP FUNCTION IF EXISTS `func_getSplitString`$$ CREATE FUNCTION `func_getSplitString`( f_string varchar(1000),f_delimit varchar(5),f_order int ) RETURNS varchar(255) BEGIN declare result varchar(255) default ''; set result = reverse(substring_index(reverse(substring_index(f_string,f_delimit,f_order)),f_delimit,1)); return result; END$$ DELIMITER ;$$
参考文档:mysql实现字符串分割SPLIT函数的四种方法
最后,通过几个例子,仔细体会下mysql中split函数的实现与用法。
先设置:SET GLOBAL log_bin_trust_function_creators = 1;
1,函数func_splitStringTotal:将字符串按指定方式分割,并计算单元总数
代码:
复制代码 代码示例:
DELIMITER $$
CREATE FUNCTION `func_get_splitStringTotal`(
f_string varchar(10000),f_delimiter varchar(50)
) RETURNS int(11)
BEGIN
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END$$
DELIMITER ;
2,函数func_splitString:将字符串按指定方式分割,获取指定位置的数
代码:
复制代码 代码示例:
DELIMITER $$
DROP function IF EXISTS `func_splitString` $$
CREATE FUNCTION `func_splitString`
( f_string varchar(1000),f_delimiter varchar(5),f_order int)
RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END$$
SELECT func_splitString('1,2,3,4,5,6,7',',',1);
3,过程splitString 将字符串分割,并放到临时表tmp_split中
代码:
复制代码 代码示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS `splitString` $$
CREATE PROCEDURE `splitString`
(IN f_string varchar(1000),IN f_delimiter varchar(5))
BEGIN
declare cnt int default 0;
declare i int default 0;
set cnt = func_split_TotalLength(f_string,f_delimiter);
DROP TABLE IF EXISTS `tmp_split`;
create temporary table `tmp_split` (`val_` varchar(128) not null) DEFAULT CHARSET=utf8;
while i < cnt
do
set i = i + 1;
insert into tmp_split(`val_`) values (func_split(f_string,f_delimiter,i));
end while;
END$$
call splitString('a,s,d,f,g,h,j',',');
SELECT * from tmp_split;
更多有关mysql split函数的用法,请参考:在mysql中实现split函数的几种方法 。
就介绍这些吧,希望借助以上的例子,大家可以实现更好的mysql split函数,也欢迎分享更多的精彩实例。