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

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

       我一想这个比較简单,直接查查菜单, 给他统计一下不就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中真的有非常多的东西让我们去学习。学的知识一些皮毛。

继续努力!

原文地址:https://www.cnblogs.com/blfbuaa/p/7130230.html