又到了周五了,好像挺久沒更博客了…
今天早早完成了任務,想著安排個,于是乎便有了今天的這篇文章
今天的主要內容是對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字)
點個贊唄


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96099.html
標籤:其他
