又到了周五了,好像挺久没更博客了…
今天早早完成了任务,想着安排个,于是乎便有了今天的这篇文章
今天的主要内容是对Case函数的使用
具体的情景是:一个人在一个公司的组织架构中的位置,也就是 层级,比如一级部门,二级部门…567…,不同的人会存在不同的部门下,具体实现的功能就是在某人不是末级部门时,填充后边的部门,也就是说,假如有5级部门,当一个人在二级部门时,345级部门的名称就替换成二级部门的名称。
OK,开局配置明白了,上代码!
1、使用的数据库还是我之前安排用于博客测试数据用的,在这新建表
if NOT exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HierarchyDepartment]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[HierarchyDepartment](
[ID] [int] IDENTITY(1,1) NOT NULL, --主键ID
[PeopleID] int NULL, --姓名
[Dept1] [nvarchar](50) NULL, --一级部门
[Dept2] [nvarchar](50) NULL, --二级部门
[Dept3] [nvarchar](50) NULL, --三级部门
[Dept4] [nvarchar](50) NULL, --四级部门
[Dept5] [nvarchar](50) NULL, --五级部门
-- .......六、七....
)
END
GO
2、添加数据:这里使用之前的数据库表[CopySQLTableData]关联
insert HierarchyDepartment
values (1,'集团本部','','','',''),
(2,'集团本部','人力资源中心','','',''),
(3,'集团本部','人力资源中心','人事管理部','',''),
(4,'集团本部','人力资源中心','人事管理部','招聘部',''),
(5,'集团本部','人力资源中心','人事管理部','招聘部','专员')
GO
--由于CopySQLTableData表数据不够,再新加点数据
insert CopySQLTableData
values ('李莉',1,21,GETDATE(),''),
('小红',1,22,GETDATE(),'')
GO
3、查询现在的情况
4、联合查询,顺便筛选有效信息(以人的表为主表)
5、数据上第4点看的很清楚了,那我们的实现效果呢就是“填充”,如图,(把圆圈内容填充至矩形中)
6、(1)、实现推后一个层级(我把上边关联的数据添加到了临时表)
SELECT
ID ,Name ,Age ,CASE WHEN Age >=18 THEN '成年' ELSE '未成年' END as Age_New,
Dept1,Dept2 ,Dept3 ,Dept4 ,Dept5 ,Dept1 ,
CASE WHEN Dept2 ='' AND Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept1 ELSE Dept2 END AS Dept2_New,
CASE WHEN Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept2 ELSE Dept3 END AS Dept3_New,
CASE WHEN Dept4 ='' AND Dept5 ='' THEN Dept3 ELSE Dept4 END AS Dept4_New,
CASE WHEN Dept5 ='' THEN Dept4 ELSE Dept5 END AS Dept5_New
FROM #item
–结果
从上图可以分辨两种颜色的CASE使用,蓝色的是处理年龄,看是否成年,我这数据全是18及以上的,有点巧合性,也可以换成20;
红色的就是重点的,两边数据对比,发现是不是每一个为空的都赋值了上一级的部门名称了?但是只是后一级,而不是所有的。这里你们看代码可以想一想是哪里的问题。
①、好比使用第一个数据进去想,CASE Dept2时,第一条CASE是可行的,所以走THEN路,即取Dept1的值
②、第二条CASE:他也是可行的,THEN Dept3,但是Dept3他也是空的
③、第三条CASE:他也是可行的,THEN Dept4,但是Dept4他也是空的
…
所以,他并没有取到所需要的值,在第二个CASE时,他取的是Dept3,但Dept3也是空的,就要再往上取,即Dept2,Dept2也是空的,还要往上,即Dept1,Dept1不为空,则取Dept1 的值。
–往简单点说就是各种情况都要CASE出来:
7、全部可能性CESE出来:
SELECT
ID ,Name ,Age ,CASE WHEN Age >=20 THEN '大于等于20岁' ELSE '小于20岁' END as Age_New,
Dept1,Dept2 ,Dept3 ,Dept4 ,Dept5 ,Dept1 ,
CASE WHEN Dept2 ='' AND Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept1
ELSE Dept2 END AS Dept2_New,
CASE
WHEN Dept2 ='' AND Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept1
WHEN Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept2
WHEN Dept4 ='' AND Dept5 ='' THEN Dept3
ELSE Dept3 END AS Dept3_New,
CASE
WHEN Dept2 ='' AND Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept1
WHEN Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept2
WHEN Dept4 ='' AND Dept5 ='' THEN Dept3
WHEN Dept5 ='' THEN Dept4
ELSE Dept4 END AS Dept4_New,
CASE
WHEN Dept2 ='' AND Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept1
WHEN Dept3 ='' AND Dept4 ='' AND Dept5 ='' THEN Dept2
WHEN Dept4 ='' AND Dept5 ='' THEN Dept3
WHEN Dept5 ='' THEN Dept4
ELSE Dept5 END AS Dept5_New
FROM #item
结果:
这里我也是把18变成了20来看效果,当然这不是重点,重点是后边为空的都把他最高级部门赋值到了后边为空的部门了!!!(这也就是我们所要实现的功能了。)
Star:这里我的数据添加进去是以’’添加进去的,是空字符串,而不是NULL,所以在有的情况下,还要添加Dept IS NULL的判断
啊!终于一步步写完了(2800字)
点个赞呗