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转换成多行,要替换的记录有很多条

解决方案 »

  1.   

    如果只是出现在第一个逗号前 那这样就可以了 
    with t1 as
    (
         select 1 id,'123,236,569' route from dual union all
         select 2 id,'123' route from dual union all
         select 3 id,'1234,569' route from dual 
    )
    select id,
           decode(replace(substr(route,1,4),',',''),'123',replace(route,'123','321'),route) route
    from t1     id      route
    --------------------------------
    1 1 321,236,569
    2 2 321
    3 3 1234,569
      

  2.   

    oracle有个函数可以实现反转,楼主可能需要先进行一些处理后,获得需要进行转换的字符,然后用reverse函数就可以了select reverse('123') col from dualcol
    ------------
    321
      

  3.   


    这样可以满足替换
    我原帖'有什么简便的方法,最好不要先将字段route转换成多行,要替换的记录有很多条'
    之前有想过用regexp_substr,但在存储过程里还要UPDATE,一条记录为1个ID,记录较多,ROUTE字段再分行,存储过程里不太好写,故我问有简便的方法么 
      

  4.   

    以第一个逗号为标准 来替换
    with t1 as
    (
         select 1 id,'123,236,569' route from dual union all
         select 2 id,'123' route from dual union all
         select 3 id,'1234,569' route from dual 
    )select id,
           decode(substr(route,1,instr(route||',',',')-1),'123',replace(route,'123','321'),route) route
    from t1 
      

  5.   

    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
      

  6.   

    我的想法是这样的,你要先考虑到乱码的种类,先把乱码清除掉,比如把1234替换为*。然后用replace函数把123替换为321,然后把*替换为1234。
      

  7.   

    我上面那方法不行么?数据换下也可以 将12换成21with t1 as
    (
         select 1 id,'123,236,569' route from dual union all
         select 2 id,'12' route from dual union all
         select 3 id,'1234,569' route from dual  union all
         select 4 id,'12,3' route from dual
    )
     
    select id,
           decode(substr(route,1,instr(route||',',',')-1),'12',replace(route,'12','21'),route) route
    from t1 
         id       route
    ---------------------------------
    1 1 123,236,569
    2 2 21
    3 3 1234,569
    4 4 21,3
      

  8.   

    select TRANSLATE('123,236,569','123','321') from dual TRANSLATE(string,from_str,to_str)
    返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。
      

  9.   

    只判断和替换第一个逗号前的字符串
    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
    4 4 21,12,123
      

  10.   

    WITH t1 AS
      ( SELECT 1 id,'123,236,569' route FROM dual
      UNION ALL
      SELECT 2 id,'123' route FROM dual
      UNION ALL
      SELECT 3 id,'1234,569' route FROM dual
      UNION ALL
      SELECT 4 id,'423,123' FROM dual
      )
    SELECT id,SUBSTR(REPLACE(route||',','123,','321,'),1,LENGTH(route)) FROM t1;
      

  11.   


    这个正确 结贴
    WITH t1 AS
      ( SELECT 1 id,'123,236,569' route FROM dual
      UNION ALL
      SELECT 2 id,'123' route FROM dual
      UNION ALL
      SELECT 3 id,'1234,569' route FROM dual
      UNION ALL
      SELECT 4 id,'423,123' FROM dual
      union all
      SELECT 5 id,'423,44123' FROM dual
      
      )
    select substr(REPLACE(route||',','123,','321,'),1,length(route)) from t1
    这样的要求  最后是44123的这样的就不能替换了吧    这个sql还是不满足需求的
      

  12.   


    这个正确 结贴
    WITH t1 AS
      ( SELECT 1 id,'123,236,569' route FROM dual
      UNION ALL
      SELECT 2 id,'123' route FROM dual
      UNION ALL
      SELECT 3 id,'1234,569' route FROM dual
      UNION ALL
      SELECT 4 id,'423,123' FROM dual
      union all
      SELECT 5 id,'423,44123' FROM dual
      
      )
    select substr(REPLACE(route||',','123,','321,'),1,length(route)) from t1
    这样的要求  最后是44123的这样的就不能替换了吧    这个sql还是不满足需求的WITH t1 AS  ( SELECT 1 id,'123,236,569' route FROM dual 
    UNION ALL  SELECT 2 id,'123' route FROM dual 
    UNION ALL  SELECT 3 id,'1234,569' route FROM dual   
    UNION ALL  SELECT 4 id,'423,123' FROM dual   
    union all  SELECT 5 id,'423,44123' FROM dual  

    select substr(REPLACE(','||route||',',',123,',',321,'),2,length(route)) from t1 再变一下就OK了
      

  13.   


    这个正确 结贴
    WITH t1 AS
      ( SELECT 1 id,'123,236,569' route FROM dual
      UNION ALL
      SELECT 2 id,'123' route FROM dual
      UNION ALL
      SELECT 3 id,'1234,569' route FROM dual
      UNION ALL
      SELECT 4 id,'423,123' FROM dual
      union all
      SELECT 5 id,'423,44123' FROM dual
      
      )
    select substr(REPLACE(route||',','123,','321,'),1,length(route)) from t1
    这样的要求  最后是44123的这样的就不能替换了吧    这个sql还是不满足需求的WITH t1 AS  ( SELECT 1 id,'123,236,569' route FROM dual 
    UNION ALL  SELECT 2 id,'123' route FROM dual 
    UNION ALL  SELECT 3 id,'1234,569' route FROM dual   
    UNION ALL  SELECT 4 id,'423,123' FROM dual   
    union all  SELECT 5 id,'423,44123' FROM dual  

    select substr(REPLACE(','||route||',',',123,',',321,'),2,length(route)) from t1 再变一下就OK了
    谢谢额  我用正则也实现了 不过你的方法比较简单
    WITH T1 AS
     (SELECT 1 ID, '123,236,569' ROUTE
        FROM DUAL
      UNION ALL
      SELECT 2 ID, '123' ROUTE
        FROM DUAL
      UNION ALL
      SELECT 3 ID, '1234,569' ROUTE
        FROM DUAL
      UNION ALL
      SELECT 4 ID, '423,123'
        FROM DUAL
      UNION ALL
      SELECT 5 ID, '423,44123' FROM DUAL
      union all
      select 6 ID, '221,123,432' from dual
      )select regexp_substr(regexp_replace(','||ROUTE||',',',[1]{1}[2]{1}[3]{1},',',321,'),'\d+.*\d') from t1