假设我现在 有一个字段 里面存放的可能是
  a,b,c  或者 aa,bb,a,c 或者 a(就是里面的数字有多少个痘号分割)
我要怎么讲‘,’来截取,把里面的数都取出来!
跪求指教

解决方案 »

  1.   

    SQL如下:
    SELECT SUBSTR (s, 1, INSTR (s, ',', 1, 1) - 1) c1
         , SUBSTR (s, INSTR (s, ',', 1, 2) + 1, INSTR (s, ',', 1, 3)-INSTR (s, ',', 1, 2)-1) c2
         , SUBSTR (s, INSTR (s, ',', 1, 3) + 1, INSTR (s, ',', 1, 4)-INSTR (s, ',', 1, 3)-1) c3
     , SUBSTR (s, INSTR (s, ',', 1, 4) + 1, INSTR (s, ',', 1, 5)-INSTR (s, ',', 1, 4)-1) c4
    FROM   (SELECT 'a1,web,cow,db,cd,' s
            FROM   DUAL)
      

  2.   

    参考一下这个,改改就行:
    create table tmp5 (id number(2),name varchar2(10),code varchar2(50));
    alter table tmp5 add constraint pk_tmp5 primary key (id);
    insert into tmp5 values (1,'aaa','c001/c002/c007');
    insert into tmp5 values (2,'bbb','c001/c003');
    insert into tmp5 values (3,'ccc','c008/c0011/c029/c023');
    insert into tmp5 values (4,'ddd','c102/c111/c112/c144/c167');select id,
    name,
    --rn,
    --code,
    substr(code, st, decode(ed, 0, length(code), ed - st)) code
    from (select id,
    name,
    code,
    rn,
    decode(rn, 1, 1, instr(code, '/', 1, rn - 1) + 1) st,
    instr(code, '/', 1, rn) ed
    from (select *
    from tmp5,
    (select rownum rn
    from dual
    connect by rownum <=
    (select max(length(code)) -
    max(length(replace(code, '/', ''))) + 1
    from tmp5))))
    where ed > 0
    or st > 1
    order by id, rn;
      

  3.   


        功能描述:用指定分隔符切割输入的字符串,返回一维数组,每个数组元素为一个子串。源代码:CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
        RETURN ty_str_split
    IS
        j INT := 0;
        i INT := 1;
        len INT := 0;
        len1 INT := 0;
        str VARCHAR2 (4000);
        str_split ty_str_split := ty_str_split ();
    BEGIN
        len := LENGTH (p_str);
        len1 := LENGTH (p_delimiter);    WHILE j < len
        LOOP
            j := INSTR (p_str, p_delimiter, i);        IF j = 0
            THEN
                j := len;
                 str := SUBSTR (p_str, i);
                 str_split.EXTEND;
                 str_split (str_split.COUNT) := str;            IF i >= len
                THEN
                    EXIT;
                END IF;
            ELSE
                str := SUBSTR (p_str, i, j - i);
                i := j + len1;
                str_split.EXTEND;
                str_split (str_split.COUNT) := str;
            END IF;
        END LOOP;    RETURN str_split;
    END fn_split;
    /测试:DECLARE
        CURSOR c
        IS
            SELECT *
              FROM TABLE (CAST (fn_split ('1;;12;;123;;1234;;12345', ';;') AS ty_str_split
                               )
                         );    r c%ROWTYPE;
    BEGIN
        OPEN c;    LOOP
            FETCH c INTO r;        EXIT WHEN c%NOTFOUND;
            DBMS_OUTPUT.put_line (r.column_value);
        END LOOP;    CLOSE c;
    END;

     
    结果:
    1
    12
    123
    1234
    12345
      

  4.   

    10gDECLARE
        p_csvlist VARCHAR2(100) := '2002, 7369, 7499, 7902, 7934';
        v_count INTEGER;
    BEGIN
        SELECT COUNT(*) INTO v_count
        FROM   emp e
        WHERE  e.empno IN
               ( SELECT REGEXP_SUBSTR(p_csvlist, '[^,]+',1,ROWNUM)
                 FROM   dual
                 CONNECT BY ROWNUM <= LENGTH(p_csvlist) - LENGTH(REPLACE(p_csvlist,',')) );    DBMS_OUTPUT.PUT_LINE(v_count || ' rows');
    END;10g以下DECLARE
    p_csvlist VARCHAR2(100) := '2002, 7369, 7499, 7902, 7934';
    v_count INTEGER;
    BEGIN
    WITH values_tab1 AS
           ( SELECT p_csvlist
                  , LEVEL AS pos
                  , SUBSTR(p_csvlist,ROWNUM,1) AS ch
                  , COUNT(CASE WHEN SUBSTR(p_csvlist,ROWNUM,1) = ',' THEN '#' END)
                    OVER (ORDER BY LEVEL) AS section
             FROM   dual CONNECT BY LEVEL <= LENGTH(p_csvlist) )    , values_tab2 AS
           ( SELECT SUBSTR(p_csvlist,MIN(pos), 1 + MAX(pos) - MIN(pos)) AS val
             FROM   values_tab1
             WHERE  ch <> ','
             GROUP BY p_csvlist,section ) SELECT COUNT(*) INTO v_count
    FROM   emp e
    WHERE  e.empno IN
           ( SELECT val
             FROM   values_tab2 ); DBMS_OUTPUT.PUT_LINE(v_count || ' rows');
    END;
      

  5.   

    CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000)这个是什么意思呢?