数据格式如下:ac~defg~123gf~g~ 
abc~~123~ldfg~yyyy~
~~abc~33~~def~ccc~做分隔符
我现在要删除值是不知道的, 只知道这个值的位置比如ac~defg~123gf~g~ 看做一个数组的方式, ac代表0,defg代表1,依次向后推。  好比我现在好删除2这个位置的值。 就是删除123gf。 数据量可能在几万条的样子。
那位高手有没有办法?

解决方案 »

  1.   

    SQL> select substr('ac~defg~123gf~g~',1,instr('ac~defg~123gf~g~','~',1,2)-1)||substr('ac~defg~123gf~
    g~',instr('ac~defg~123gf~g~','~',1,3)) from dual;SUBSTR('AC~DEFG~123G
    --------------------
    ac~defg~g~
      

  2.   

    没看明白楼主的意思。如果是说以一个”~“为分割符的话,1楼的SQL就行,但楼主的字符串中有几个”~“在一起的,不知道是否是算一个”~“来处理还是按多个来处理。比如说如果”~~“是作为一个”~“来处理的,要删除5这个位置的,如果是要删除”123“的话,1楼的就不行了。
      

  3.   

    可以先用replace把连续的~处理成一个~,然后用1楼的方法处理
      

  4.   

    如果有多个不确定"~"怎么replace?如果要对 字符串"~~abc~33~~def~ccc" 操作,取哪一条记录? def 还是 33?
      

  5.   

    可以循环判断,instr('串','~~')>0 就replace('串','~~','~'),知道不含有'~~'为止
      

  6.   

    怎么循环判断?用PL\SQL? 或者用CONNECT BY方式生成ROWNUM?
      

  7.   

    -- 下面3种方法任选一种吧,但必须ORACLE是10G以上版本才支持正则表达式:
    SQL> SELECT RTRIM(REGEXP_SUBSTR('ac~~defg~~~123gf~g~','.*?'||'(~){1,}',1,3),'~') STR FROM DUAL;STR
    -----
    123gf
    SQL> SELECT LTRIM(SUBSTR('ac~~defg~~~123gf~g~',
      2                      REGEXP_INSTR('ac~~defg~~~123gf~g~', '(~){1,}', 1, 2),
      3                      REGEXP_INSTR('ac~~defg~~~123gf~g~', '(~){1,}', 1, 3) -
      4                      REGEXP_INSTR('ac~~defg~~~123gf~g~', '(~){1,}', 1, 2)),
      5               '~') STR
      6    FROM DUAL;STR
    -----
    123gf
    SQL> SELECT SUBSTR(REGEXP_REPLACE('ac~~defg~~~123gf~g~', '(~){1,}', '~'),
      2                INSTR(REGEXP_REPLACE('ac~~defg~~~123gf~g~', '(~){1,}', '~'),
      3                      '~',
      4                      1,
      5                      2) + 1,
      6                INSTR(REGEXP_REPLACE('ac~~defg~~~123gf~g~', '(~){1,}', '~'),
      7                      '~',
      8                      1,
      9                      3) -
     10                INSTR(REGEXP_REPLACE('ac~~defg~~~123gf~g~', '(~){1,}', '~'),
     11                      '~',
     12                      1,
     13                      2) - 1) STR
     14    FROM DUAL;STR
    -----
    123gf
      

  8.   

    lz没有说一定要用sql吧,用过程不就好了
      

  9.   

    oracle 9i 的版本。 
    不使用SQL,本来就是写的存储过程。各位帮忙写个完整的。 谢谢了