有个表A中有数据如下
         gfid    gfname
01 档案查阅
01.01 档案阅览
01.01.1 导出
01.01.2 打印
01.01.3 收藏
01.02 目录浏览
01.03 档案查询
01.04 全文检索
02 档案借阅
02.01 借阅办理
02.01.1 借出
02.01.2 归还
 ………………怎么读出来生成符合树控件的包含父id数据
         gfid    gfname   parentId
01 档案查阅   0
01.01 档案阅览   01
01.01.1 导出       01.01
01.01.2 打印       01.01
01.01.3 收藏       01.01
01.02 目录浏览   01
01.03 档案查询   01
01.04 全文检索   01
02 档案借阅   0
02.01 借阅办理   02
02.01.1 借出       02.01
02.01.2 归还       02.01
………………
已有的数据,不能改数据库结构了,只能自己补齐先天的不足。高手指点一下谢谢。

解决方案 »

  1.   

    select s.*,decode(substr(gfid,0,instr(gfid,'.',-1)-1),null,0,substr(gfidid,0,instr(gfid,'.',-1)-1)) from tablename s这样试试
      

  2.   

    好吧,从表结构上来说,确实不合理。但办法总归有的:
    select 
    gfid, 
    gfname,
    case instr(gfid, '.', -1, 1) when 0 then '0' else substr(gfid, 0,instr(gfid, '.', -1, 1)-1) end as parentid 
    from testtable98
    order by gfid
      

  3.   

    case instr(gfid, '.', -1, 1) when 0 then '0' else substr(gfid, 0,instr(gfid, '.', -1, 1)-1) end as parentid
    =>
    decode(instr(gfid, '.', -1, 1),0 , '0' , substr(gfid, 0,instr(gfid, '.', -1, 1)-1)) as parentid
      

  4.   

    WITH T AS(
      SELECT '01' AS GFID,'档案查阅' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.01','档案阅览' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.01.1','导出' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.01.2','打印' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.01.3','收藏' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.02','目录浏览' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.03','档案查询' AS GFNAME FROM DUAL UNION ALL
      SELECT '01.04','全文检索' AS GFNAME FROM DUAL UNION ALL
      SELECT '02','档案借阅' AS GFNAME FROM DUAL UNION ALL
      SELECT '02.01','借阅办理' AS GFNAME FROM DUAL UNION ALL
      SELECT '02.01.1','借出' AS GFNAME FROM DUAL UNION ALL
      SELECT '02.01.2','归还' AS GFNAME FROM DUAL
    )
    SELECT CASE
      WHEN LENGTH(GFID) - LENGTH(REPLACE(GFID,'.')) = 0 THEN '0'
      WHEN LENGTH(GFID) - LENGTH(REPLACE(GFID,'.')) = 1 THEN REGEXP_SUBSTR(GFID,'[^.]+',1,1)
      WHEN LENGTH(GFID) - LENGTH(REPLACE(GFID,'.')) = 2 THEN REGEXP_SUBSTR(GFID,'[^.]+',1,2)
      END AS PID, 
      CASE
      WHEN LENGTH(GFID) - LENGTH(REPLACE(GFID,'.')) = 0 THEN GFID
      WHEN LENGTH(GFID) - LENGTH(REPLACE(GFID,'.')) = 1 THEN REGEXP_SUBSTR(GFID,'[^.]+',1,2)
      WHEN LENGTH(GFID) - LENGTH(REPLACE(GFID,'.')) = 2 THEN REGEXP_SUBSTR(GFID,'[^.]+',1,3)
      END AS GID, 
      GFID,GFNAME
    FROM T;
    PID GID GFID GFNAME
    0 01 01 档案查阅
    01 01 01.01 档案阅览
    01 1 01.01.1 导出
    01 2 01.01.2 打印
    01 3 01.01.3 收藏
    01 02 01.02 目录浏览
    01 03 01.03 档案查询
    01 04 01.04 全文检索
    0 02 02 档案借阅
    02 01 02.01 借阅办理
    01 1 02.01.1 借出
    01 2 02.01.2 归还
      

  5.   

    create table tree(gfid varchar2(20),gfname varchar2(50));insert into tree
    (select '01','档案查阅' from dual
    union select '01.01  ',' 档案阅览' from dual
    union select '01.01.1',' 导出    ' from dual
    union select '01.01.2',' 打印    ' from dual
    union select '01.01.3',' 收藏    ' from dual
    union select '01.02  ',' 目录浏览' from dual
    union select '01.03  ',' 档案查询' from dual
    union select '01.04  ',' 全文检索' from dual
    union select '02     ',' 档案借阅' from dual
    union select '02.01  ',' 借阅办理' from dual
    union select '02.01.1',' 借出    ' from dual
    union select '02.01.2',' 归还    ' from dual);commit;select gfid,gfname,nvl(substr(gfid,1,instr(gfid,'.',-1)-1),0) pgfid from tree;