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