假设一张表叫做课本,主键为课本名称,有一个字段为语言,格式为“中文,英文,德文”,现在想查询所有课本具有的语言,举例
表数据:课本名称  语言线性代数  英语,中文
数据结构  中文
离散数学  中文,德文,日语我现在想得到的结果为:
英文
中文
德文
日语或者 ‘英语,中文,德文,日语’这样也可以。麻烦大虾指教一下,我想了一会儿,没有头绪,请教大家了。
  

解决方案 »

  1.   

    select wmsys.wm_concat(lang)
      from book;还得做一下处理;
      

  2.   

    scott@ORA1> select * from book;NAME
    --------------------
    LANG
    ------------------------------------------------------------------------------------------------------------------------
    a
    english, chineseb
    chinesec
    chinese, gam, jap
    scott@ORA1> with t as (
      2     select wmsys.wm_concat(lang) label
      3    from book
      4  )
      5  select distinct *
      6    from
      7   (
      8   select trim(substr(label
      9     ,instr(label, ',', 1, rn) + 1
     10        ,instr(label, ',', 1, rn + 1) - instr(label, ',', 1, rn) - 1
     11       )
     12      ) label
     13     from
     14   (
     15   --笛卡尔积
     16   select ',' || t1.label || ',' as label, x.rn
     17     from t t1, (
     18      --这里构成一个序列
     19   select rownum rn
     20     from (
     21      select max(length(label) - length(replace(label, ','))) + 2 comma_cnt --逗号的数量
     22        from t
     23         )
     24      connect by rownum <= comma_cnt
     25      ) x
     26   )
     27   )
     28   where label is not null;LABEL
    ------------------------------------------------------------------------------------------------------------------------
    english
    chinese
    jap
    gam
      

  3.   

    这个就是你要的sql了,10g上才有wmsys.wm_concat, 否则需要自定义聚集函数:with t as (
    --替换这个里
       select wmsys.wm_concat(lang) label
     from book
    )
    select distinct *
      from
    (
    select trim(substr(label 
      ,instr(label, ',', 1, rn) + 1
         ,instr(label, ',', 1, rn + 1) - instr(label, ',', 1, rn) - 1
        )
       ) label
      from
    (
    --笛卡尔积
    select ',' || t1.label || ',' as label, x.rn
      from t t1, (
       --这里构成一个序列
    select rownum rn
      from (
       select max(length(label) - length(replace(label, ','))) + 2 comma_cnt --逗号的数量
         from t
          )
       connect by rownum <= comma_cnt
       ) x
    )

     where label is not null