本帖最后由 sundcy 于 2013-02-18 15:56:53 编辑

解决方案 »

  1.   

    另外一种处理,是无论1、2、3是否包含aa/bb/cc/dd/ee,都给列出5行,然后各自判断是否包含对应的值
    也即:
    1,aa,包含,Y
    1,bb,包含,
    1,cc,包含,Y
    1,dd,不包含,
    1,ee,不包含,
      

  2.   

    正则表达式,举个例子with a as
     (select 1 id, 'a,b,c,d' name
        from dual
      union
      select 2 id, 'e,f,g' name from dual
      )select distinct id, regexp_substr(name, '[[:alnum:]]+', 1, level)
      from a
    connect by level <= length(regexp_replace(name, '[[:alnum:]]+')) + 1
      

  3.   


    行数很多的,没法逐一select啊……
      

  4.   


    而且我是9i,没法regexp_substr 
      

  5.   


    WITH A AS
    ( SELECT 1 ID,'aa bb cc dd' NAME FROM DUAL UNION ALL
      SELECT 2 ID,'aa cc dd' NAME FROM DUAL UNION ALL
      SELECT 3 ID,'cc dd ee' NAME FROM DUAL
    )
    SELECT A.ID,
           SUBSTR(' '||A.NAME||' ',
                  INSTR(' '||A.NAME||' ',' ',1,B.RN)+1,
                  INSTR(' '||A.NAME||' ',' ',1,B.RN+1)-INSTR(' '||A.NAME||' ',' ',1,B.RN)-1
                  ) AS "单值"
           ,B.RN "第几个单值",
           INSTR(' '||A.NAME||' ',' ',1,B.RN) "单值前空格的位置",
           INSTR(' '||A.NAME||' ',' ',1,B.RN+1) "单值后空格的位置"
    FROM A,
         (SELECT ROWNUM RN FROM DUAL CONNECT BY ROWNUM<100) B
    WHERE INSTR(A.NAME,' ',1,B.RN)>0
    ORDER BY ID,B.RN; 
      

  6.   

    最后我还是按处理方式2来做了,比较笨,但效果达到了。
    具体如下:在数据为下面的情况下:
    id, value
    1, "aa bb cc dd" 
    2, "aa cc dd"
    3, "cc dd ee"
    with temp as
        (select  '1' id ,'aa'resposeinfo from dual 
        union all 
        select  '1' ,'bb' from dual 
        union all 
        select  '1' ,'cc' from dual 
        union all 
        select  '1' ,'dd' from dual 
        union all 
        select  '1' ,'ee' from dual 
        union all 
        select  '1' ,'ff' from dual )select id,
           a.value,
           temp.resposeinfo  resposeinfo,
           case
             when instr(a.value,resposeinfo)>0 then
             resposeinfo
           end request
      from a
      left join temp on temp.id=1