将树形菜单拼接为名称+路径

        这几天用户提出来一个这样的需求,要看上次系统上线的时候和这次要上线的系统的的菜单做一下对比,找出来那些的是新增的。而且要把路径写出来! 

       我一想这个比较简单,直接查查菜单, 给他统计一下不就OK了,但是我点了点,傻眼了,我们的菜单有好几百个,两个系统加起来有一千多,这么多我咋统计啊,我承认我是一个比较懒的人。不想去一个一个的查,所有只能想办法了。

       因为我们的菜单都是存储数据库中的,大家看一下是如何存储的。他不是树形结构,而是用funcitoncode去表示四位一组,每一组从0001开始,同一级别的依次加1,而子级别的在后边在加上0001,依次类推。如下图所示。

        

       通过分析数据的存储方式,我们就要来梳理一下我们的思路,首先我们要查出菜单的名称,其次是他的路径。名称比较好查,关键是路径,我们要吧当前名称的上一级查出来,如果上一级有上一级还要继续查,一直查到顶级为止。这样的话是不是要写一个循环做一个判断,但是我们知道在sql中如果不借助T-SQL是不能写循环的。所以只能pass掉了。

        那么我们想下一种方案,假设最高有8层(我们一定要保证最高层少于8层),那么functioncode就有32位,我们吧每少四位对应的名字都查出来。这样我们在将他们组合在一起。这样不久OK了! 看一下sql语句。

select  functionname ,   --菜单名称
     to_char(trim(lujing8))|| '->' ||to_char(trim(lujing7))|| '->' ||to_char(trim(lujing6))|| '->' ||
     to_char(trim(lujing5))|| '->' ||to_char(trim(lujing4))|| '->' ||
     to_char(trim(lujing3))|| '->' ||to_char(trim(lujing2))|| '->' ||to_char(trim(lujing1))    --菜单路径
from (
   select  functionname,
   (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-4)) )
    ) lujing1,
   (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-8)) )
    ) lujing2,
   (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-12)) )
    ) lujing3,
    (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-16)) )
    ) lujing4,
     (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-20)) )
    ) lujing5,
     (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-24)) )
    ) lujing6,
      (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-28)) )
    ) lujing7,
      (
   select functionname from t_function tf where trim(tf.functioncode) = trim(substr(t.functioncode,0,(length(trim(t.functioncode))-32)) )
    ) lujing8
from t_function t 
order by functioncode
);

通过以上sql语句,我们查处的结果集如下。我们在将数据放入excel中,替换掉前边的->, 这样我们的记过就出来了!

 

         我发现sql中真的有很多的东西让我们去学习。学的知识一些皮毛。继续努力!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值