参数var_id 实际上是传进来的string , 
var_id :='123,456,789' ;select id, name from test_tbl where id in (var_id) 
如何把in 里面的(‘123,456,789’)变成它能识别的类型(‘123’,‘456’,‘789’)?

解决方案 »

  1.   


    --id为字符类型
    select id,name
    from test_tb1
    where id in(
          substr(string,1,3),
          substr(string,5,3),
          substr(string,9,3));
    --id为数字(number)类型
    select id,name
    from test_tb1
    where id in(
          to_number(substr(string,1,3)),
          to_number(substr(string,5,3)),
          to_number(substr(string,9,3)));
      

  2.   

    declare
      var_id varchar2(100) := '123,456,789';
    begin
      select '''' || replace(var_id, ',', ''',''') || ''''
        into var_id
        from dual;
      dbms_output.put_line(var_id);
    end;
    --结果是'123','456','789'
      

  3.   

    谢谢你的答案,呵呵, 我之前也是这样做的, 结果把它放在sql里面,那个in 就变成了 in ("'123','456','789' ") ,它始终还是一个字符串的,结果是一条记录都没有查出来呢
      

  4.   

    谢谢你的思路 , 但是我的实际情况是, 这个 ID 的字符串很长, 有分解后有100个的时候,我是不是得写100个substr呢?并且还是得 1,5,9,13.这样写下去啊。。不写写得累, 如果再多一点,效率估计也不怎么高啊
      

  5.   

    最外边那一层双引号怎么出来的?传进来的?还是你后来拼进去的?
    replace掉不行吗?
    把你的完整sql贴出来我看看
      

  6.   

    不不不,我只是想告诉你, 那个双引号代表着, 我传进去的那个变量var_id 是一个我定义的varchar2 类型嘛, 我in (var_id)里面的 就算你变成了'123','456','789' , 它也只是识别你传进来的是一个字符串, 而不是 id in (var1,var2,var3) 这种格式
      

  7.   

    -- 用 存储过程 + 动态SQL 可以解决!请看:http://topic.csdn.net/u/20110331/10/35ae9f81-e437-48ac-8de3-4bc4af1b66e0.html
      

  8.   

    知道了 这种问题我也遇到过
    你换成instr试试
    例子:
    select *
      from mw_app.mwt_gradeinfo g
     where instr((select '''' || replace('123,456,789', ',', ''',''') || ''''
                 
                   from dual),
                 g.stuname,
                 1,
                 1) > 0
      

  9.   

    上边的方式有点小问题 就是 会把123 12 23这样的数据都查出来
    换成 select * from mw_app.mwt_gradeinfo g
     where instr((select '''' || replace('123,456', ',', ''',''') || '''' as newsubjects
                   from dual),
                 '''' || g.subject || '''',
                 1,
                 1) > 0;
    这样就好了 匹配的时候 前后各加一个引号 就把12 23这种模糊匹配的数据过滤掉了 
      

  10.   

    恩,2楼的replace+7楼的open cursor