需求:
现在有个表 app
id app_name
1 a
2 b
3 c
4 d
在数据库中传一个 1,2,3过来 要得到 a,b,c这样的结果
-- 函数如下:
-- i_str 表示传进去的 字符串 f_delimit 表示分隔符
drop function if exists func_get_split_string;
create function func_get_split_string(i_str varchar(128), f_delimit varchar(3))
returns varchar(512)
begin
set @rs = '';
set @i = length(i_str) - length(replace(i_str,f_delimit,'')); -- 算出分隔符的总数
set @sub_str = i_str;
set @left_str = i_str;
while @i>0 -- 有多少个分隔符就循环多少遍
do
set @sub_str = substr(@left_str,1,instr(@left_str,f_delimit)-1); -- 得到分隔符前面的字符串
set @left_str = substr(@left_str,length(@sub_str)+length(f_delimit)+1); -- 得到分隔符后面的字符串
set @n = trim(@sub_str);
select COALESCE(max(app_name),'') into @split_string from app where id = @n; -- 用分隔符前面的字符串关联查询表
set @i = @i - 1;
set @rs = concat(@rs,',',@split_string); -- 将得到的结果放到结果串
end while;
set @n = trim(@left_str);
select COALESCE(max(app_name),'') into @split_string from app where id = @n;
set @rs = concat(@rs,',',@split_string);
return substr(@rs,2) ; -- 返回去掉最前面的 ,
end;
-- 调用函数的办法
select func_get_split_string('1,2,3',',');
注意:
1. 遇到这样的错误
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
解决办法 执行 :set global log_bin_trust_function_creators=TRUE;
2. 在函数中 select @变量 := 字段 from 表名 ;这样的语句是不能通过的, 但是在过程里面是可以的。
Not allowed to return a result set from a function