当前位置: 首页 > news >正文

部门拆分

根据你的需求,需要根据 level 字段判断层级,然后基于 - 分割 dept_path 来提取四个层级的部门信息。以下是几种SQL写法:

方案一:使用 CASE WHEN + SUBSTRING_INDEX(推荐)

SELECT
dept_name AS original_dept,
level,
dept_path,
-- 提取第一层部门(第一个-之前的部分)
CASE
WHEN level = '一层部门' THEN dept_path
ELSE SUBSTRING_INDEX(dept_path, '-', 1)
END AS dept1,
-- 提取第二层部门(第一个-和第二个-之间的部分)
CASE
WHEN level = '一层部门' THEN NULL
WHEN level = '二级部门' THEN SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 2), '-', -1)
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 2), '-', -1)
END AS dept2,
-- 提取第三层部门(第二个-和第三个-之间的部分)
CASE
WHEN level IN ('一层部门', '二级部门') THEN NULL
WHEN level = '三级部门' THEN SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 3), '-', -1)
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 3), '-', -1)
END AS dept3,
-- 提取第四层部门(第三个-之后的部分)
CASE
WHEN level IN ('一层部门', '二级部门', '三级部门') THEN NULL
WHEN level = '四级部门' THEN SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', -1), '-', -1)
ELSE NULL
END AS dept4
FROM department_table;

方案二:更清晰的 CASE WHEN 嵌套

SELECT
dept_name,
level,
dept_path,
-- 第一层总是取第一个元素
SUBSTRING_INDEX(dept_path, '-', 1) AS dept1,
-- 第二层:如果是一级部门则为NULL,否则取第二个元素
CASE
WHEN level = '一层部门' THEN NULL
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 2), '-', -1)
END AS dept2,
-- 第三层:如果是二级及以下部门则为NULL,否则取第三个元素
CASE
WHEN level IN ('一层部门', '二级部门') THEN NULL
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 3), '-', -1)
END AS dept3,
-- 第四层:只有四级部门才取第四个元素
CASE
WHEN level = '四级部门' THEN SUBSTRING_INDEX(dept_path, '-', -1)
ELSE NULL
END AS dept4
FROM department_table;

方案三:使用 IF 函数(更简洁)

SELECT
dept_name,
level,
dept_path,
SUBSTRING_INDEX(dept_path, '-', 1) AS dept1,
IF(level <> '一层部门', SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 2), '-', -1), NULL) AS dept2,
IF(level IN ('三级部门', '四级部门'), SUBSTRING_INDEX(SUBSTRING_INDEX(dept_path, '-', 3), '-', -1), NULL) AS dept3,
IF(level = '四级部门', SUBSTRING_INDEX(dept_path, '-', -1), NULL) AS dept4
FROM department_table;

方案四:动态解析(适用于任意层级)

如果你想要更通用的解决方案,可以创建一个函数来解析路径:

-- 创建函数(MySQL 8.0+ 支持JSON_TABLE,或者自定义函数)
DELIMITER $$
CREATE FUNCTION get_dept_by_level(path VARCHAR(255), level_num INT)
RETURNS VARCHAR(100)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE result VARCHAR(100);
DECLARE path_count INT;

SET path_count = LENGTH(path) - LENGTH(REPLACE(path, '-', '')) + 1;IF level_num > path_count THENRETURN NULL;
END IF;IF level_num = 1 THENSET result = SUBSTRING_INDEX(path, '-', 1);
ELSEIF level_num = path_count THENSET result = SUBSTRING_INDEX(path, '-', -1);
ELSESET result = SUBSTRING_INDEX(SUBSTRING_INDEX(path, '-', level_num), '-', -1);
END IF;RETURN result;

END$$
DELIMITER ;

-- 使用函数查询
SELECT
dept_name,
level,
dept_path,
get_dept_by_level(dept_path, 1) AS dept1,
get_dept_by_level(dept_path, 2) AS dept2,
get_dept_by_level(dept_path, 3) AS dept3,
get_dept_by_level(dept_path, 4) AS dept4
FROM department_table;

示例数据和测试结果

假设有测试数据:

-- 测试数据
SELECT '人事一部' as dept_path, '一层部门' as level
UNION ALL SELECT '人事一部-人事二部', '二级部门'
UNION ALL SELECT '人事一部-人事二部-人事三部', '三级部门'
UNION ALL SELECT '人事一部-人事二部-人事三部-人事四部', '四级部门';

使用方案二的查询结果:

dept_name level dept_path dept1 dept2 dept3 dept4
人事一部 一层部门 人事一部 人事一部 NULL NULL NULL
人事一部-人事二部 二级部门 人事一部-人事二部 人事一部 人事二部 NULL NULL
人事一部-人事二部-人事三部 三级部门 人事一部-人事二部-人事三部 人事一部 人事二部 人事三部 NULL
人事一部-人事二部-人事三部-人事四部 四级部门 人事一部-人事二部-人事三部-人事四部 人事一部 人事二部 人事三部 人事四部

关键点说明

  1. SUBSTRING_INDEX 函数:

◦ SUBSTRING_INDEX(str, delim, count):按分隔符截取字符串

◦ count > 0:从左开始截取第count个分隔符之前的部分

◦ count < 0:从右开始截取第|count|个分隔符之后的部分

  1. 处理逻辑:

◦ 无论什么层级,dept1 总是取第一个部门

◦ dept2 只在二级及以上部门显示

◦ dept3 只在三级及以上部门显示

◦ dept4 只在四级部门显示

推荐使用方案二,逻辑清晰易懂,维护方便。

http://www.rkmt.cn/news/68925.html

相关文章:

  • 2025年浙江指南舟手机服务权威推荐榜单:浙江指南舟口碑维修/浙江指南舟考证维护/浙江指南舟培训服务商精选
  • 上海离婚律师怎么选:5位离婚继承律师的测评
  • 华安泰昌HATC智能交易系统:引领贵金属交易平台智能化新纪元
  • 2023玻璃钢旅游船制造商实力榜:武船二司以创新设计引领潮流,五大优势品牌深度解析
  • 2025新能源观光船制造商实力榜:武进二造以绿色智能技术引领,六大潜力本土品牌深度解析
  • 2023仿古旅游船制造商实力榜:武船二司以精湛工艺引领潮流,五大优质国产品牌深度解析
  • iOS 应用网络权限弹窗的障碍及解决强大的方案
  • 2025双层旅游船制造商实力榜:武船二司以创新设计领跑,六大国内品牌深度解析
  • 20232410 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 基于循环谱分析的盲源分离信号处理MATLAB
  • 2025年刺激游乐设施制造厂权威推荐榜单:游乐设备/公园游乐设施/小型游乐设施源头厂家精选
  • 小程序开发公司哪家靠谱?6大核心筛选标准+无隐性收费清单:活动小程序、微信小程序、支付宝小程序、抖音小程序全涵盖
  • 小程序开发公司哪家好,2025年精选靠谱服务商深度测评:抖音小程序、支付宝小程序、微信小程序全涵盖小程序开发公司推荐
  • 2025年12月香港公司注册代办服务商榜单前五推荐
  • 体脂秤方案:pcba运行原理
  • 征途智选:博士留学中介科研申请双能导航权威评测
  • 送女友礼物不踩雷:极萌胶原炮领衔10款心意好礼,懂她更宠她
  • 到北京看病 怎么找陪诊师
  • P1628 合并序列
  • 前瞻视野:十大博士留学中介研究与落地方案
  • 2025线上雅思机构测评:留学与职场双驱下,哪款更适配你的提分需求?
  • 微算法科技(NASDAQ:MLGO)以区块链技术重塑信任生态,驱动数字化变革
  • 2025年管线管生产厂家联系方式汇总,全国重点企业官方联系方式与高效采购指南
  • 口碑炸裂的去痘印次抛精华推荐,2025 年 5款精准匹配痘印类型,敏肌友好
  • 软服之家|2025国产QMS质量管理系统年度软件
  • 软件设计模式(tyutJAVA 状态模式实验) - 详解
  • 香橙派R2S手搓双宽带聚合指南
  • QTableView 增加Combox
  • 2025中国汽车电子领域领先企业推荐榜单!我国汽车电子领域有哪些领先企业?
  • 完整教程:Linux学习之旅6