这几天用户提出来一个这种需求,要看上次系统上线的时候和这次要上线的系统的的菜单做一下对照,找出来那些的是新增的。并且要把路径写出来!
我一想这个比較简单,直接查查菜单, 给他统计一下不就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中真的有非常多的东西让我们去学习。学的知识一些皮毛。
继续努力!