SQL使用Case When Then进行多条件判断案例

  • Post author:
  • Post category:其他


又到了周五了,好像挺久没更博客了…

今天早早完成了任务,想着安排个,于是乎便有了今天的这篇文章

今天的主要内容是对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字)

点个赞呗

在这里插入图片描述

在这里插入图片描述



版权声明:本文为qq_44471040原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。