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

以逗号分隔的字符串替换问题
id    route
 1   '123,236,569'
 2   '123'
 3   '1234,569'
如字段route  ‘123,236,569’ 以逗号间隔 也可能是单个 '123'
现要替换其中的‘123’为'321' ,
如'123,236,569'替换为成 '321,236,569'  '123'替换成'321',
但要避免一种情况 '1235,236,569' 不能替换成 '3215,236,569'
如id 1和2 符合条件

有什么简便的方法,最好不要先将字段route转换成多行,要替换的记录有很多条



------解决方案--------------------
估计要正则,可惜我不是很擅长正则
------解决方案--------------------
oracle有个函数可以实现反转,楼主可能需要先进行一些处理后,获得需要进行转换的字符,然后用reverse函数就可以了

select reverse('123') col from dual

col
------------
321
------解决方案--------------------
CREATE TABLE STUDY(
 ID INT PRIMARY KEY,
ROUTE VARCHAR2(255)
);
INSERT INTO STUDY(ID,ROUTE) VALUES(1,'123,236,569');
INSERT INTO STUDY(ID,ROUTE) VALUES(2,'123');
INSERT INTO STUDY(ID,ROUTE) VALUES(3,'1234,569');

SELECT ID,
reverse(SUBSTR(route,0,case when INSTR(route, ',')=0 then LENGTH(route) else INSTR(route, ',')-1 end)) 
FROM STUDY

------解决方案--------------------
楼主的这个问题太麻烦了,一直关注中,可到现在没有一个是正确的啊


------解决方案--------------------
持续关注
果然现实需求都是很麻烦的
------解决方案--------------------
我的想法是这样的,你要先考虑到乱码的种类,先把乱码清除掉,比如把1234替换为*。然后用replace函数把123替换为321,然后把*替换为1234。
------解决方案--------------------
select TRANSLATE('123,236,569','123','321') from dual 

TRANSLATE(string,from_str,to_str)
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。
------解决方案--------------------
只判断和替换第一个逗号前的字符串


with t1 as
(
     select 1 id,'123,12,569' route from dual union all
     select 2 id,'12' route from dual union all
     select 3 id,'1234,12' route from dual  union all
     select 4 id,'12,12,123' route from dual
)

select id,
       case when instr(route,',') = 0 then decode(route,'12','21',route)
       when instr(route,',') > 0 then decode(substr(route,1,instr(route,',')-1),'12','21'
------解决方案--------------------
substr(route,-(length(route)-length('12'))),route) 
       end route
from t1 

     id       route
----------------------------------
1 1 123,12,569
2 2 21
3 3 1234,12