mysql 字符串分割函数

需求:


现在有个表 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



你可能感兴趣的:(mysql 字符串分割函数)