T-Sql
WHERE 子句中的 CASE - 返回單行結果而不是 4 行?
大家,我不想用整個表模式來打擾你,所以我將只粘貼幾個螢幕截圖,以便我的問題變得清晰 - 我需要顯示與 EmployeeID = 24 相關的所有項目,如果項目已經開始或 2005 年後,ProjectName 欄位應為“NULL”,否則 ProjectName 應顯示實際值。
一旦我以這種方式解決它,我只會在 MS SQL Management Studio 中收到一個結果
SELECT Employees.EmployeeID, Employees.FirstName, Projects.[Name] AS [ProjectName], Projects.StartDate FROM Employees INNER JOIN EmployeesProjects ON EmployeesProjects.EmployeeID = Employees.EmployeeID JOIN Projects ON Projects.ProjectID = EmployeesProjects.ProjectID WHERE Employees.EmployeeID = 24 AND Projects.[Name] = CASE WHEN Projects.StartDate = '2005' THEN NULL WHEN Projects.StartDate > '2005' THEN NULL ELSE Projects.[Name] END
如果我部分執行上述程式碼:
SELECT Employees.EmployeeID, Employees.FirstName, Projects.[Name] AS [ProjectName], Projects.StartDate FROM Employees INNER JOIN EmployeesProjects ON EmployeesProjects.EmployeeID = Employees.EmployeeID JOIN Projects ON Projects.ProjectID = EmployeesProjects.ProjectID WHERE Employees.EmployeeID = 24
根據隨附的螢幕截圖,有 4 個結果:
建議使用此解決方案並給出滿分:
SELECT E.EmployeeID,FirstName, CASE WHEN P.StartDate > '01/01/2005' THEN NULL ELSE P.NAME END FROM Employees AS E INNER JOIN EmployeesProjects AS EP ON EP.EmployeeID = E.EmployeeID INNER JOIN Projects AS P ON EP.ProjectID = P.ProjectID WHERE E.EmployeeID = 24
但是,我想問一下為什麼我的解決方案只顯示一行,我在查詢序列方式上的錯誤是什麼?是否可以通過首先進行連接然後使用包含 CASE 的 WHERE 子句來檢索相同的內容?
感謝您的回饋!
ps 如果您需要腳本(模式、插入),請告訴我,我也可以添加它們。
該
WHERE
子句用於過濾數據。您不是要過濾掉記錄,而是要包含它們,但要根據它們的實際值更改它們的顯示值。這就是CASE
語句中的SELECT
語句為您提供所需結果的原因。具體來說,您的查詢省略 3 個結果的原因不是因為該
CASE
語句不起作用,而是前 2 個WHEN
語句可能總是評估為 false。實際上,何時Projects.StartDate >= '2005/01/01'
必須Projects.[Name]
等於NULL
要選擇的記錄。如果員工 24 有任何在 2005 年 1 月 1 日或之後開始的項目以及NULL
項目名稱,則將顯示這些記錄。為了進一步細分,對於查詢中的每條記錄,它將執行以下操作。
- 檢查是否
Projects.StartDate = '2005-01-01 00:00:00.000'
. 如果是這樣,確實如此Projects.[Name] = NULL
。如果是,則返回記錄。- 如果步驟 1 中的檢查結果為假,則檢查是否
Projects.StartDate > '2005-01-01 00:00:00.000'
. 如果是這樣,確實如此Projects.[Name] = NULL
。如果是,則返回記錄。- 如果第 1 步和第 2 步中的檢查評估為假,
Projects.[Name] = Projects.[Name]
則返回記錄。提示:它總是會的。由於與員工 24 關聯的 3 條記錄在“2005-01-01 00:00:00.000”或之後,並且沒有
NULL
項目名稱,因此它們被排除在結果之外。