本文介绍了mysql split函数的多个实例,mysql split函数的多种实现方法,由于mysql默认没有split函数,因此需要自己实现,本文分享的这几例split函数代码还不错。
例1,mysql split函数代码。
复制代码 代码示例:
delimiter $$
drop function if exists `f_split_varchar`$$
create
function `f_split_varchar`(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 ;
下面继续通过几个例子,学习mysql split函数的实现方法。
想在mysql里把一段用固定符号分隔的字符串,按分隔符分别列出来。
就是一个典型的split应用,但是mysql却没有自带这个函数,可以通过自建函数来解决。
相关链接:mysql实现字符串分割SPLIT函数的四种方法
例1:
复制代码 代码示例:
delimiter $$
create function `func_get_split_string_total`(
f_string varchar(1000),f_delimiter varchar(5)
) returns int(11)
begin
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
end$$
delimiter ;
delimiter $$
create 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 ;
需要设置下参数:
set global log_bin_trust_function_creators = 1;
测试下以上mysql split函数的用法,分析下实现原理(脚本学堂 www.jb200.com 编辑整理):
复制代码 代码示例:
create table "t" (
-> "t1" varchar(100) default null,
-> "t2" int(11) default null
-> ) engine=
myisam default charset=utf8;
mysql> insert into t(t1,t2) values('a,b,c,d',1);
query ok, 1 row affected (0.00 sec)
mysql> insert into t(t1,t2) values('a b c d',2);
query ok, 1 row affected (0.00 sec)
mysql> select * from t;
+---------+------+
| t1 | t2 |
+---------+------+
| a,b,c,d | 1 |
| a b c d | 2 |
+---------+------+
2 rows in set (0.00 sec)
首先,用func_get_split_string_total函数得到符合匹配的数量。
复制代码 代码示例:
mysql> select func_get_split_string_total(t1,',') from t where t2=1;
+-------------------------------------+
| func_get_split_string_total(t1,',') |
+-------------------------------------+
| 4 |
+-------------------------------------+
1 row in set (0.00 sec)
然后,用func_get_split_string得出想要的字符串
复制代码 代码示例:
mysql> select func_get_split_string(t1,',',1) from t where t2=1;
+---------------------------------+
| func_get_split_string(t1,',',1) |
+---------------------------------+
| a |
+---------------------------------+
1 row in set (0.00 sec)
mysql> select func_get_split_string(t1,',',2) from t where t2=1;
+---------------------------------+
| func_get_split_string(t1,',',2) |
+---------------------------------+
| b |
+---------------------------------+
1 row in set (0.00 sec)
mysql> select func_get_split_string(t1,',',3) from t where t2=1;
+---------------------------------+
| func_get_split_string(t1,',',3) |
+---------------------------------+
| c |
+---------------------------------+
1 row in set (0.00 sec)
mysql> select func_get_split_string(t1,',',4) from t where t2=1;
+---------------------------------+
| func_get_split_string(t1,',',4) |
+---------------------------------+
| d |
+---------------------------------+
1 row in set (0.00 sec)
当然,这只是个思路,如果你想把所有字符串都列出来,可以写个过程,在其中循环下也是可以的。
为了更好的掌握mysql split函数的实现方法,大家可以研究一下下面的几个例子。
例1,自定义mysql split函数实现 获取按指定字符分割的字符串的个数:
复制代码 代码示例:
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,mysql split自定义函数得到第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;
end while;
set returnstr = substring(returnstr,2);
return returnstr;
end if;
end$$