遇到一个刺手的问题,望高手指点,谢谢!!
问题:在存储过程传入符合IN方式的字符串,接着在存储过程里面使用游标用IN方式接收传入的字符串,但就查了符合一条记录.
例如:传入字符串 STR = 1,2,3,4
SELECT A,B,C FROM TABLENAME WHERE CODE IN (STR)
游标数据集中只得到了CODE=1的记录,而表中存在有CODE=(2,3,4)的记录
问题:在存储过程传入符合IN方式的字符串,接着在存储过程里面使用游标用IN方式接收传入的字符串,但就查了符合一条记录.
例如:传入字符串 STR = 1,2,3,4
SELECT A,B,C FROM TABLENAME WHERE CODE IN (STR)
游标数据集中只得到了CODE=1的记录,而表中存在有CODE=(2,3,4)的记录
begin
SELECT A,B,C FROM TABLENAME WHERE find_in_set(code,str);
end;
or
SELECT A,B,C FROM TABLENAME WHERE instr(concat(',',str,','),concat(',',code,','))>0
其它在MYSQL还有很多方法和函数比如 INSTR, REGEXP, LIKE
但很显然效率上会差很多,并不可取。
drop procedure if exists p1;
CREATE PROCEDURE p1 (param_1 varchar(30))
BEGIN
declare str_sql varchar(2000);
set str_sql=concat('SELECT * from test1 where id in(',param_1,')');
set @E=str_sql;
PREPARE stmt1 FROM @E;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END;call p1('1,2,3');
用预处理语句拼出SQL,再执行,也能达到目的。但没FIND_IN_SET(CODE,STR)好。
其实楼上zuoxingyu的 PREPARE/EXECUTE 方法在执行速度上会优于FIND_IN_SET,可以使用到索引。 主要需要编写这个存储过程。 如果你的表中记录非常多的放,则建议使用#6楼的方法。
那位朋友有完整的mysql函数,能否发一份给我,谢谢!