【发布时间】:2016-02-04 17:55:03
【问题描述】:
诚然,标题可能有点混乱,所以我先举个例子。
我有一个包含大量数据的表。我将一个日期传递给一个存储过程,该存储过程将用作相当标准的select 上的where 的一部分:
@MinDate DATETIME
SELECT *
FROM MyTable
WHERE (@MinDate IS NULL OR DatePublished >= @MinDate)
这很好用,但是数据库是否会为每条记录评估@MinDate?即它是否击中where 并且必须每次都检查null?如果是这样,将其重构为:
@MinDate DATETIME
IF(@MinDate IS NULL)
SELECT *
FROM MyTable
ELSE
SELECT *
FROM MyTable
WHERE DatePublished >= @MinDate
编辑:请忽略一些小的语法错误,为了简单起见,我已经断章取义了。我问的前提还是很清楚的。
【问题讨论】:
-
只需在提供 MinDate 和 NULL 的情况下首先检查执行计划。无论如何,您的问题是关于
short-circuit evaluation -
答案取决于使用的 dbms。标记您正在使用的那个。
-
这里存在潜在的性能问题。我使用
OPTION(RECOMPILE)进行此类查询。阅读 Erland Sommarskog 的 Dynamic Search Conditions in T‑SQL 了解详细信息和其他处理方法。
标签: sql select null where sql-server-2014