供参考:http://bbs.csdn.net/topics/390680263 的#3

解决方案 »

  1.   


    select t.tname, WMSYS.WM_CONCAT(b.g_name)
      from tb1 t
      left join tb2 b
        on instr(',' || t.g_id || ',', ',' || b.g_id || ',') > 0
     group by t.tname
      

  2.   

    case ... when怎么写?不太好写吧!
      

  3.   

    我看了别人的例子,自己写了一个函数,但是有点问题。一时想不明白,大家帮我看看,谢谢大家了。CREATE OR REPLACE FUNCTION F_SPLIT(PUT_STR       IN VARCHAR2,
                                       PUT_DELIMITER IN VARCHAR2,
                                       FIND_STR      IN VARCHAR2)
      RETURN VARCHAR2
    /*
      功能:用于将一行中存在多个值的数据分别转换为另一个对应的值。。如:'1,2,3'转换为:'一,二,三' 
      Put_str 是输入的字符串值,如:1,2,3
      Put_delimiter 是分割符 ,如:','
      find_str 是想要找的字符串
      编写时间:2014-01-26
      */
     AS
      I      INT := 1;
      J      INT := 0;
      LEN1   INT := 0;
      LEN2   INT := 0;
      P_STR1 VARCHAR2(1000);
      P_STR2 VARCHAR2(1000);
    BEGIN
      P_STR1 := TRIM(BOTH PUT_DELIMITER FROM PUT_STR);
      LEN1   := LENGTH(P_STR1);
      J      := INSTR(P_STR1, PUT_DELIMITER, I);
        IF J = 0 THEN
          SELECT GNAME INTO P_STR1 FROM GROUP1 WHERE GROUP_ID = P_STR1;
          RETURN P_STR1;
        END IF;
        
      WHILE J > 0 LOOP
          SELECT GNAME
            INTO P_STR2
            FROM GROUP1
           WHERE GROUP_ID = SUBSTR(P_STR1, I, J - 1);
          P_STR1 := P_STR1 || ',' || P_STR2;
          I      := J + 1;
          J      := INSTR(P_STR1, PUT_DELIMITER, I);
          IF j=0 THEN
            GOTO here;
          END IF;
      END LOOP;
      <<here>>
      RETURN P_STR1;
    END;
      

  4.   


    供参考:http://bbs.csdn.net/topics/390680263 的#3这样的语句我理解不了。照抄的话没有进步。我试过这样的语句,20000行的数据量,执行时间十几分钟都执行不出结果。
      

  5.   

    3楼的可以参考,不过wmsys.wm_contact好像不能按顺序排列
      

  6.   

    写了一天,还是自己写出来了。CREATE OR REPLACE FUNCTION F_SPLIT(PUT_STR       IN VARCHAR2,
                                       PUT_DELIMITER IN VARCHAR2,
                                       FIND_STR      IN VARCHAR2)
      RETURN VARCHAR2
    /*
      功能:用于将一行中存在多个值的数据分别转换为另一个对应的值。。如:'1,2,3'转换为:'一,二,三'
      Put_str 是输入的字符串值,如:1,2,3
      Put_delimiter 是分割符 ,如:','
      find_str 是想要找的字符串
      编写时间:2014-01-26
      */
     AS
      I       INT := 1;
      J       INT := 0;
      LEN1    INT := 0;
      LEN2    INT := 0;
      P_STR1  VARCHAR2(1000);
      P_STR2  VARCHAR2(1000);
      P_STR3  CLOB;
      V_COUNT NUMBER(2);
    BEGIN
      P_STR1 := TRIM(BOTH PUT_DELIMITER FROM PUT_STR);
      P_STR3 := '';
      LEN1   := LENGTH(P_STR1);
      J      := INSTR(P_STR1, PUT_DELIMITER, I);  IF J = 0 THEN
        SELECT GNAME INTO P_STR3 FROM GROUP1 WHERE GROUP_ID = P_STR1;
        RETURN P_STR3;
      END IF;
      /*
      思路:当J>0时,说明是组合值。
      1、取第一个值对应的组名是否为空,为空,取下一个值。不为空,取值后,循环下一个值
      2、第二个值是否为空,为空,是否有下一个值,有,则取值,判断是否有一下个值。
      */
      WHILE J > 0 LOOP
        SELECT COUNT(*)
          INTO V_COUNT
          FROM GROUP1
         WHERE GROUP_ID = SUBSTR(P_STR1, I, J - I);
      
        IF V_COUNT > 0 THEN 
          SELECT GNAME
            INTO P_STR2
            FROM GROUP1
           WHERE GROUP_ID = SUBSTR(P_STR1, I, J - I);
        
          I      := J + 1;
          J      := INSTR(P_STR1, PUT_DELIMITER, I);
          P_STR3 := P_STR2 || ',' || P_STR3;
        
          IF J > 0 THEN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM GROUP1
             WHERE GROUP_ID = SUBSTR(P_STR1, I, j - i);
            IF V_COUNT > 0 THEN
              SELECT GNAME
                INTO P_STR2
                FROM GROUP1
               WHERE GROUP_ID = SUBSTR(P_STR1, I,j - i);
              P_STR3 := P_STR2 || ',' || P_STR3;
            END IF;
          END IF;
        END IF;
        I := J + 1;
        J := INSTR(P_STR1, PUT_DELIMITER, I);
      
        IF J = 0 THEN
          SELECT GNAME
            INTO P_STR2
            FROM GROUP1
           WHERE GROUP_ID = SUBSTR(P_STR1, I);
          P_STR3 := P_STR2 || ',' || P_STR3;
        END IF;
      END LOOP;
      RETURN P_STR3;
    END;