原字符串:AA+BB+CC-DD+EE-FF+WW
希望排列成:AA+BB+CC+EE+WW-FF-DD
请大家帮忙阿!!!!

解决方案 »

  1.   

    我想题目应该是:原字符串:AA+BB+CC+EE+WW-FF-DD
    希望排列成:AA+BB+CC-DD+EE-FF+WW
      

  2.   

    不明白啊!是sql语句么?用什么实现呢!
      

  3.   

    随手写了一个过程,不知道是否满足你的要求:create or replace function change_str(s varchar2)
      return varchar2
    as
      v_out  varchar2(100);
      v_last varchar2(100);
      v_temp varchar2(100);
      iLoop  pls_integer;
      iLoop2 pls_integer;
    begin
      v_out := ''; v_last := '';
      iLoop := 1;
      while iLoop <= length(s)
      loop
        select substr(s, iLoop, 1) into v_temp from dual;
        if v_temp = '-' then
          v_last := v_last || v_temp;
          iLoop2 := iLoop + 1;
          while iLoop2 <= length(s)
          loop
            select substr(s, iLoop2, 1) into v_temp from dual;
            exit when (v_temp = '-') or (v_temp = '+');
            v_last := v_last || v_temp;
            iLoop2 := iLoop2 + 1;
          end loop;
          iLoop := iLoop2;
        else
          v_out := v_out || v_temp;
          iLoop := iLoop + 1;
        end if;
      end loop;
      return v_out || v_last;
    end change_str;
    /运行:
    select change_str('AA+BB+CC-DD+EE-FF+WW') from dual;
    结果:
    CHANGE_STR('AA+BB+CC-DD+EE-FF+
    --------------------------------------------------------------------------------
    AA+BB+CC+EE+WW-DD-FF
      

  4.   

    create or replace procedure String_ReOrder(STR varchar2) is
    begin
    DECLARE 
     STRLEN NUMBER;
     STRL VARCHAR2(100);
     STRR VARCHAR2(100);
     STRT VARCHAR2(100); 
    BEGIN 
    STRT := STR ;
    STRR := '';FOR I IN 1.. LENGTH(STR)-LENGTH(REPLACE(STR,'-','')) LOOP  
        STRLEN := INSTR(STRT,'-',1);     
        STRL := STRL||SUBSTR(STRT,1,STRLEN-1) ;       
        STRT := SUBSTR(STRT,STRLEN);        
        STRLEN := INSTR(STRT,'+',1);
        STRR := STRR||SUBSTR(STRT,1,STRLEN-1); 
        STRT := SUBSTR(STRT,STRLEN);   
    END LOOP;
    IF SUBSTR(STRT,1,1) = '+' THEN 
       STRL := STRL||STRT;
    ELSE 
       STRR := STRR||STRT;
    END IF;
        DBMS_OUTPUT.put_line(STRL||STRR);
    END ;
    end String_ReOrder;SQL> EXEC String_ReOrder('AA+BB+CC-DD+EE-FF+WW-W-WQ+589+456');
    AA+BB+CC+EE+WW+589+456-DD-FF-W-WQ
    PL/SQL procedure successfully completed
      

  5.   

    xiaoxiao1984(潇潇) 的方法算比较好,循环的次数比较少。
    但是这个循环的次数控制还是稍微多了点,可以不可以改为:
    while INSTR(STRT,'-',2)<0 and INSTR(STRT,'+',2)<0 loop
    ...
    ...
    end loop
      

  6.   

    也建议xiaoxiao1984(潇潇)把过程改为函数,这样的话就可以在SQL中调用!
      

  7.   

    hehe,减少循环次数,再改成函数吧 create or replace function String_ReOrder_Func_1 (STR varchar2) return varchar2 is
    begin
    DECLARE
    STRLEN NUMBER;
    STRL VARCHAR2(100);
    STRR VARCHAR2(100);
    STRT VARCHAR2(100);
    BEGIN
    STRT := STR ;
    STRR := '';while INSTR(STRT,'-',2)>0 or INSTR(STRT,'+',2)>0  LOOP 
    STRLEN := INSTR(STRT,'-',1);
    STRL := STRL||SUBSTR(STRT,1,STRLEN-1) ;
    STRT := SUBSTR(STRT,STRLEN);
    STRLEN := INSTR(STRT,'+',1);
    STRR := STRR||SUBSTR(STRT,1,STRLEN-1);
    STRT := SUBSTR(STRT,STRLEN);
    end loop;IF SUBSTR(STRT,1,1) = '+' THEN
    STRL := STRL||STRT;
    ELSE
    STRR := STRR||STRT;
    END IF;DBMS_OUTPUT.put_line(STRL||STRR);
    return (STRL||STRR);
    END ;
    end String_ReOrder_Func_1;