SQL使用Case When Then進行多條件判斷案例

2020-09-19 16:01:03

又到了週五了,好像挺久沒更部落格了…
今天早早完成了任務,想著安排個,於是乎便有了今天的這篇文章

今天的主要內容是對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字)
點個讚唄

在這裡插入圖片描述

在這裡插入圖片描述