应如何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
and SecondDate
,这样:
- 如果我们指定
FirstDate
andSecondDate
来过滤2022-1-1
,将返回记录 2 和 3(但不是 1!)。 - 如果我们指定
FirstDate
andSecondDate
来过滤2024-1-1
,将返回记录 4 和 5(但不是 3!)。 - 如果我们指定
FirstDate
andSecondDate
来过滤2025-1-1
,将返回记录 4。
通过利用CTE和窗口函数,您基本上可以通过单个查询实现您的目标,如下所示:
这基本上工作的方式是通过检查表的
IsMatchOnFirstDate
每一行来计算字段是否与变量匹配,并在任何行匹配时为所有行返回值 1 (因此是窗口函数).Items
FirstDate
@SomeDate
然后,来自 CTE 的最终选择仅在何时过滤
FirstDate
(IsMatchOnFirstDate = 1
意味着仅当表中的至少一个行与Items
匹配时FirstDate = @SomeDate
),否则它会过滤SecondDate
(因为FirstDate
在计算时没有任何行匹配IsMatchOnFirstDate
)。听起来像是临时表的工作 在临时表中运行插入选择并使用@@rowcount 找出插入了多少行。添加一个 if 语句并有条件地运行第二个插入选择。最后从临时表中选择行返回结果