遇到一个刺手的问题,望高手指点,谢谢!!
问题:在存储过程传入符合IN方式的字符串,接着在存储过程里面使用游标用IN方式接收传入的字符串,但就查了符合一条记录.
例如:传入字符串 STR = 1,2,3,4
     SELECT A,B,C FROM TABLENAME WHERE CODE IN (STR)
     游标数据集中只得到了CODE=1的记录,而表中存在有CODE=(2,3,4)的记录

解决方案 »

  1.   

    改成SELECT A,B,C FROM TABLENAME WHERE FIND_IN_SET(CODE,STR)
      

  2.   

    create procedure uspI(in str varchar(100))
    begin 
         SELECT A,B,C FROM TABLENAME WHERE find_in_set(code,str);
    end;
      

  3.   

    SELECT A,B,C FROM TABLENAME WHERE FIND_IN_SET(CODE,STR)
    or
    SELECT A,B,C FROM TABLENAME WHERE instr(concat(',',str,','),concat(',',code,','))>0
      

  4.   

    针对楼主的问题应该使用FIND_IN_SET(CODE,STR)
    其它在MYSQL还有很多方法和函数比如 INSTR, REGEXP, LIKE 
    但很显然效率上会差很多,并不可取。
      

  5.   


    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)好。
      

  6.   


    其实楼上zuoxingyu的 PREPARE/EXECUTE  方法在执行速度上会优于FIND_IN_SET,可以使用到索引。 主要需要编写这个存储过程。 如果你的表中记录非常多的放,则建议使用#6楼的方法。
      

  7.   

    没有办法直接给游标,只能先SELECT到一个临时表中去。 PREPARE的东西比较麻烦在这一点上。
      

  8.   

    通过FIND_IN_SET方式已经解决问题
    那位朋友有完整的mysql函数,能否发一份给我,谢谢!