T-Sql

WHERE 子句中的 CASE - 返回單行結果而不是 4 行?

  • June 5, 2020

大家,我不想用整個表模式來打擾你,所以我將只粘貼幾個螢幕截圖,以便我的問題變得清晰 - 我需要顯示與 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項目名稱,則將顯示這些記錄。

為了進一步細分,對於查詢中的每條記錄,它將執行以下操作。

  1. 檢查是否Projects.StartDate = '2005-01-01 00:00:00.000'. 如果是這樣,確實如此Projects.[Name] = NULL。如果是,則返回記錄。
  2. 如果步驟 1 中的檢查結果為假,則檢查是否Projects.StartDate > '2005-01-01 00:00:00.000'. 如果是這樣,確實如此Projects.[Name] = NULL。如果是,則返回記錄。
  3. 如果第 1 步和第 2 步中的檢查評估為假,Projects.[Name] = Projects.[Name]則返回記錄。提示:它總是會的。

由於與員工 24 關聯的 3 條記錄在“2005-01-01 00:00:00.000”或之後,並且沒有NULL項目名稱,因此它們被排除在結果之外。

引用自:https://dba.stackexchange.com/questions/268601