当前位置: 首页 > 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.jsqmd.com/news/58536/

相关文章:

  • 2023仿古观光船制造实力榜:武船二司以精湛工艺引领潮流,六大优质制造商深度解析
  • 2025年不锈钢垃圾桶制造厂权威推荐榜单:金属垃圾桶‌/警卫室‌/看护房‌源头制造厂精选
  • 2025年浙江指南舟手机服务权威推荐榜单:浙江指南舟口碑维修/浙江指南舟考证维护/浙江指南舟培训服务商精选
  • 精准推荐:博士申请机构TOP10 申请亮点直击需求
  • 2025年工程龙门洗车机厂家权威推荐榜单:全封闭龙门洗车机/建筑龙门洗车机/工地龙门洗轮机源头厂家精选
  • 上海离婚律师怎么选:5位离婚继承律师的测评
  • Leonardo da Vinci
  • 华安泰昌HATC智能交易系统:引领贵金属交易平台智能化新纪元
  • 2023玻璃钢旅游船制造商实力榜:武船二司以创新设计引领潮流,五大优势品牌深度解析
  • 2025新能源观光船制造商实力榜:武进二造以绿色智能技术引领,六大潜力本土品牌深度解析
  • Tita:以 PDCA 闭环驱动项目全流程,双支撑赋能企业高效运营
  • 实用指南:从淘宝推荐到微信搜索:查找算法如何支撑亿级用户——动画可视化
  • 博士留学中介排名TOP10核心优势与择导指南
  • 2025年焦化厂专业粉状活性炭供货商权威推荐榜单:饮用水处理活性炭/椰壳黄金活性炭/蜂窝活性炭源头供货商精选
  • 2023仿古旅游船制造商实力榜:武船二司以精湛工艺引领潮流,五大优质国产品牌深度解析
  • iOS 应用网络权限弹窗的障碍及解决强大的方案
  • 2025博士留学中介申请专业度测评,靠谱之选揭秘
  • 2025年山东网络推广公司权威推荐榜单:网络营销推广‌/竞价广告‌/企业网络品牌宣传‌源头公司精选
  • 博士申请必看!十大留学机构的全链路突围指南
  • 2025双层旅游船制造商实力榜:武船二司以创新设计领跑,六大国内品牌深度解析
  • 如何选择既可靠又能控制成本的云平台?一文看懂 AWS 的平衡之道(Reliability Cost Efficiency)
  • 2025博士留学中介:申请专业度与学术匹配力解析
  • 2025电动旅游船制造商实力榜:武船二司以智能环保技术引领,六家创新本土品牌深度解析
  • 哈希表的应用
  • 2025 优质出海 GEO 优化公司推荐:技术与场景双驱的选型指南
  • 20232410 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 智慧养殖场数智化平台
  • 小程序开发公司哪家专业,技术实力+案例口碑双维度推荐:工单小程序、律所小程序、支付宝小程序、微信小程序、活动小程序、寺庙小程序全涵盖小程序开发公司推荐
  • 基于循环谱分析的盲源分离信号处理MATLAB
  • 2025年刺激游乐设施制造厂权威推荐榜单:游乐设备/公园游乐设施/小型游乐设施源头厂家精选