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