將樹形選單拼接為名稱 路徑

2022-09-17 11:42:13 字數 2584 閱讀 7352

這幾天使用者提出來乙個這種需求,要看上次系統上線的時候和這次要上線的系統的的選單做一下對照,找出來那些的是新增的。並且要把路徑寫出來! 

我一想這個比較簡單,直接查查選單, 給他統計一下不就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中真的有非常多的東西讓我們去學習。學的知識一些皮毛。

繼續努力!

DROPDOWNLIST無限樹形選單

public void getsubclass dataset ds,int level,string parentid,string sign else string ls if drr3 null drr3.length 0 else lslevel if lslevel 0 lp lp dr2...

ztree樹形選單demo

閱讀目錄 回到頂部 ztree樹形選單 樹形選單使用方式如下 html引入的方式如下 doctype html html head meta charset utf 8 title ztree樹形選單demo title link rel stylesheet href libs ztreestyl...

動態實現樹形選單

樹形選單在開發軟體和 中經常用到,但是會遇到乙個問題,在 中當你點開的時候,由於頁面重新整理了,又合起來來了,這種問題是用iframe不會出現,但是在 中很少會用到框架,最近就碰到了這樣的問題,在網上找了很多js寫的樹形選單,我需要分四級,但是都沒找到合適的,亂七八糟的 都有,很頭疼,沒辦法,自己就...