Sql-Server

按欄位過濾,如果結果為零,則按其他欄位過濾

  • January 20, 2022

應如何WHERE構造子句,例如:

  • 它按某個欄位過濾
  • 如果按上述欄位過濾的結果為零,那麼它會按另一個欄位過濾嗎?

例如,如果我們有這個模式:

CREATE TABLE Items
(
 [Id] INT PRIMARY KEY,
 [FirstDate] DATETIME,
 [SecondDate] DATETIME
);

…有這些記錄:

INSERT INTO Items ([Id], [FirstDate], [SecondDate])
VALUES 
(1, '2021-1-1', '2022-1-1'),
(2, '2022-1-1', '2023-1-1'), 
(3, '2022-1-1', '2024-1-1'), 
(4, '2024-1-1', '2025-1-1'),
(5, '2024-1-1', '2026-6-1')

…然後我想過濾FirstDateand SecondDate,這樣:

  • 如果我們指定FirstDateandSecondDate來過濾2022-1-1,將返回記錄 2 和 3(但不是 1!)。
  • 如果我們指定FirstDateandSecondDate來過濾2024-1-1,將返回記錄 4 和 5(但不是 3!)。
  • 如果我們指定FirstDateandSecondDate來過濾2025-1-1,將返回記錄 4。

通過利用CTE視窗函式,您基本上可以通過單個查詢實現您的目標,如下所示:

DECLARE @SomeDate DATETIME = '2026-06-01';

WITH _Items AS
(
   SELECT 
       Id, 
       FirstDate, 
       SecondDate,
       MAX(CASE WHEN FirstDate = @SomeDate THEN 1 ELSE 0) OVER (ORDER BY Id) AS IsMatchOnFirstDate
   FROM Items
)

SELECT
   Id,
   FirstDate,
   SecondDate
FROM _Items
WHERE (IsMatchOnFirstDate = 1 AND FirstDate = @SomeDate)
   OR (IsMatchOnFirstDate = 0 AND SecondDate = @SomeDate);

這基本上工作的方式是通過檢查表的IsMatchOnFirstDate每一行來計算欄位是否與變數匹配,並在任何行匹配時為所有行返回值 1 (因此是視窗函式).Items``FirstDate``@SomeDate

然後,來自 CTE 的最終選擇僅在何時過濾FirstDateIsMatchOnFirstDate = 1意味著僅當表中的至少一個行與Items匹配時FirstDate = @SomeDate),否則它會過濾SecondDate(因為FirstDate在計算時沒有任何行匹配IsMatchOnFirstDate)。

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