首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

求1oracle树数据sql

2013-04-21 
求一oracle树数据sql有个表A中有数据如下gfidgfname01档案查阅01.01档案阅览01.01.1导出01.01.2打印01.01.

求一oracle树数据sql
有个表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
………………
已有的数据,不能改数据库结构了,只能自己补齐先天的不足。高手指点一下谢谢。
[解决办法]
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
[解决办法]

引用:
有个表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归还
 ………………

怎……



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;



PIDGIDGFIDGFNAME
00101档案查阅
010101.01档案阅览
01101.01.1导出
01201.01.2打印
01301.01.3收藏
010201.02目录浏览
010301.03档案查询
010401.04全文检索
00202档案借阅
020102.01借阅办理
01102.01.1借出
01202.01.2归还
[解决办法]
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;

热点排行
Bad Request.