用decode或者case when 试试看

解决方案 »

  1.   

    SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
      FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x') RN,
                   T2.RNUM,
                   t1.name
              FROM T1 T1,
                   (SELECT T.RNUM, REGEXP_SUBSTR(T.id, '[^,]+', 1, LEVEL) STR
                      FROM (SELECT t.id, ROWNUM RNUM FROM T2 T) T
                    CONNECT BY LEVEL <=
                               (LENGTH(T.id) - LENGTH(REPLACE(T.id, ',', ''))) /
                               LENGTH(',') + 1
                           AND PRIOR RNUM = RNUM
                           AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) T2
             WHERE T1.ID = T2.STR) T3
     START WITH T3.RN = 1
    CONNECT BY PRIOR RN = RN - 1
           AND PRIOR T3.RNUM = T3.RNUM
     GROUP BY T3.RNUM
     order by t3.rnum;
      

  2.   

    直接的用replace函数存在什么问题?
      

  3.   

    id是否是连续的
    id随机出现
      

  4.   

    提问 @zlloct
    第12行 PRIOR DBMS_RANDOM.VALUE IS NOT NULL 的作用是什么?原文
    SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
      FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x') RN,
                   T2.RNUM,
                   t1.name
              FROM T1 T1,
                   (SELECT T.RNUM, REGEXP_SUBSTR(T.id, '[^,]+', 1, LEVEL) STR
                      FROM (SELECT t.id, ROWNUM RNUM FROM T2 T) T
                    CONNECT BY LEVEL <=
                               (LENGTH(T.id) - LENGTH(REPLACE(T.id, ',', ''))) /
                               LENGTH(',') + 1
                           AND PRIOR RNUM = RNUM
                           AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) T2
             WHERE T1.ID = T2.STR) T3
     START WITH T3.RN = 1
    CONNECT BY PRIOR RN = RN - 1
           AND PRIOR T3.RNUM = T3.RNUM
     GROUP BY T3.RNUM
     order by t3.rnum;
      

  5.   

    接上面
    第二行 ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x' 为什么 用 order by 'x' ,x 实际上不存在的
      

  6.   

    万分感谢,但实在不好意思,有些地方我没有看懂,能不能给我讲一下
    第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
    中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗
      

  7.   

    万分感谢,但实在不好意思,有些地方我没有看懂,能不能给我讲一下
    第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
    中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗你从内向外一层层看 不就知道是什么意思了 
      

  8.   

    基本思路是将一行的字段按‘,’拆分,然后替换成name,然后再拼接。
    t3.name是表的name字段,括号外的name只是别名,可以随便命名。rownum的作用是为了在拼接的时候能够区分哪些字段是属于同一行的.
      

  9.   

    Q1:
    ORACLE有个检查,如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,它就会报一个错:
    ORA-01436: CONNECT BY loop in user data.这里用了一个PRIOR DBMS_RANDOM.VALUE, 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了.
    Q2:
    因为这里不用排序,必须保留原来的顺序,如果强制排序可能会出现(3,1,2)->('张三','李四','王五'),这样结果就不对了,我们必须保留原来的顺序,但是ROW_NUMBER()OVER()中必须使用ORDER BY,所以就随便写了个'x'
      

  10.   

    第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
    中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗
    基本思路是将一行的字段按‘,’拆分,然后替换成name,然后再拼接。
    t3.name是表的name字段,括号外的name只是别名,可以随便命名。rownum的作用是为了在拼接的时候能够区分哪些字段是属于同一行的.
    你太厉害了,谢谢谢谢!!!
      

  11.   

    Quote: 引用 15 楼 fwh_007 的回复:

    非常感谢,基本对了,可是有些字段排序有些不对,有倒过来的,如下面的结果第二个记录,该怎么纠正呢?
    不好意思,我实在很外行,sql是最近才接触的,你能不能给我说下你是怎么把这个做正则的语句好其他的查询语句连接在一起的?