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


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

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

    继续努力!

  • 相关阅读:
    超强视频分割/剪辑软件-Ultra Video Splitter绿色便携版
    超强视频分割/剪辑软件-Ultra Video Splitter绿色便携版
    ASP.NET做WEB开发的工具选择
    ASP.NET做WEB开发的工具选择
    C#中的局部类型
    OpenCV2:幼儿园篇 第四章 访问图像
    OpenCV2:幼儿园篇 第三章 导出图像
    OpenCV2:幼儿园篇 第二章 读取图像
    OpenCV2:幼儿园篇 第一章 创建图像并显示
    MFC隐藏在黑暗之中的大坑
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7130230.html
Copyright © 2020-2023  润新知