在存储过程中传入一个字符串,其表示某主键的ID串,然后我需要分隔开这个字符串,查询语句中使用in来作为查询的条件语句1是这样的:
          select t.b, count(1)
            from t
           where  t.aID in ('''' || REPLACE('3,5,6', ',', ''',''') || '''')
           group by t.b这样得到的结果是为空的可是通过 select '''' || REPLACE('3,5,6', ',', ''',''') || '''' from dual;得到的结果是'3','5','6';
而          select t.b, count(1)
            from t
           where  t.aID in ('3','5','6')
           group by t.b
确是有值的,为什么呢?aID的类型是varchar2语句1该怎么改造,才能得到值呢?

解决方案 »

  1.   

    这个你查出来的'3','5','6'其实是作为一个字符串的,所以查不出来,如果想查的话,可以采用其他的办法,
    比如你传来的id串为'3,5,6',你可以把它变成',3,5,6,'
    然后instr(',' || id || ',',inParam) > 0;
      

  2.   

    查询出来也只是一个字符串而已 相当于  ' '3','5','6' '  那肯定查不到了 可以考虑分割成多行查询select t.b, count(1)
    from t
    where  t.aID in
    (
    select replace(regexp_substr('3,5,6','[^,]+',1,level),',',' ') c1
    from t1 
    connect by level<=length('3,5,6')-length(replace('3,5,6',',',''))+1
    )
    group by t.b
      

  3.   

    楼上正解,也可以这样:select t.b, count(1) from t where  t.aID in (substr('3,5,6',1,1),substr('3,5,6',3,1),substr('3,5,6',5,1)) group by t.b
      

  4.   

    ('''' || REPLACE('3,5,6', ',', ''',''') || '''')  出来的其实是(''3','5','6'') 
    而非('3','5','6') 。你再做一步操作,把第一个'和最后一个'去掉即可。
      

  5.   


    可以查下instr函数的说明,就是一个字符串在另一个字符串出现的位置,如果该字符串没在另外字符串出现,也就是说不是另外一个的字串,返回值为0