Sql-Server
按欄位過濾,如果結果為零,則按其他欄位過濾
應如何
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')
…然後我想過濾
FirstDate
andSecondDate
,這樣:
- 如果我們指定
FirstDate
andSecondDate
來過濾2022-1-1
,將返回記錄 2 和 3(但不是 1!)。- 如果我們指定
FirstDate
andSecondDate
來過濾2024-1-1
,將返回記錄 4 和 5(但不是 3!)。- 如果我們指定
FirstDate
andSecondDate
來過濾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 的最終選擇僅在何時過濾
FirstDate
(IsMatchOnFirstDate = 1
意味著僅當表中的至少一個行與Items
匹配時FirstDate = @SomeDate
),否則它會過濾SecondDate
(因為FirstDate
在計算時沒有任何行匹配IsMatchOnFirstDate
)。