應用場景:類似部門結構的多級樹形表,
舉例:有A部門(父),B部門(子),C部門(孫),D部門(曾孫),4級部門結構,業務需要給A部門權限(包括子 孫),此時業務只有A部門code,而某用戶是屬於D部門人員,這時候需要根據D部門code查詢有沒有權限。
類似於這樣的場景一般都是需要做遞歸判定的,而接下來這個sql函數就是在數據庫的基礎上來完成相關的查找。
首先來了解下相關的表結構:
CREATE TABLE `bn_dept` (
`id` bigint(22) NOT NULL AUTO_INCREMENT,
`real_code` varchar(20) NOT NULL COMMENT '部門(機構)真實code',
`dept_name` varchar(128) NOT NULL COMMENT '部門名稱',
`pcode` varchar(20) DEFAULT NULL COMMENT '父部門代碼',
`order` bigint(22) DEFAULT '1' COMMENT '排序',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `real_code` (`real_code`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=204 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
思路:同樣也是遞歸,循環查詢出上級code拼接成一個以逗號隔開的字符串做返回(如果sql語句copy後數據庫運行報錯,可能是中文字符或空格編碼格式問題)
CREATE FUNCTION `queryDeptPcodes`(deptCode VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(1024);
DECLARE sTempChd VARCHAR(255);
SET sTemp='$';
SET sTempChd = deptCode;
SET sTemp = CONCAT(sTemp,',',sTempChd);-- 根據real_code查詢出上一級code賦值到變量中
SELECT pcode INTO sTempChd FROM bn_dept WHERE real_code = sTempChd;
-- 循環條件直至根節點,每次循環都將上級節點code拼接一起做返回
WHILE sTempChd != '0' DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(pcode) INTO sTempChd FROM bn_dept WHERE real_code = sTempChd;
END WHILE;
RETURN sTemp;
END