日期:2014-05-17  浏览次数:21128 次

oracle查询中使用REPLACE函数无结果
在存储过程中传入一个字符串,其表示某主键的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该怎么改造,才能得到值呢?

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



------解决方案--------------------
查询出来也只是一个字符串而已 相当于  ' '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


------解决方案--------------------
('''' 
------解决方案--------------------
 REPLACE('3,5,6', ',', ''',''') 
------解决方案--------------------
 '''')  出来的其实是(''3','5','6'') 
而非('3','5','6') 。

你再做一步操作,把第一个'和最后一个'去掉即可。


------解决方案--------------------
引用:
引用:
这个你查出来的'3','5','6'其实是作为一个字符串的,所以查不出来,如果想查的话,可以采用其他的办法,
比如你传来的id串为'3,5,6',你可以把它变成',3,5,6,'
然后instr(',' 
------解决方案--------------------
 id 
------解决方案--------------------
 ',',inParam) > 0;
谢谢啦,从你的回答中知道了我的问题所在,可是你给的代码,>0是什么意思捏?


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