一尘不染

如何使SQL Where子句短路

sql

我正在尝试在SQL Server中执行以下查询:

declare @queryWord as nvarchar(20) = 'asdas'

SELECT  * FROM TABLE_1 
WHERE (ISDATE(@queryWord) = 1) 
AND TABLE_1.INIT_DATE = CONVERT(Date, @queryWord)

显然这会导致错误,因为无法将“ asdas”转换为Date。虽然,我期待一个不同的行为。也就是说,因为ISDATE(@queryWord) = 1为假,所以我期望SQL不检查第二个条件,但显然可以。

我知道还有其他一些方法可以执行此查询,但这不是我的问题。我想知道是否有某种方法可以不检查第二个条件,即第一个条件不满足。我很好奇,因为我认为SQL已经做到了这一点。


阅读 182

收藏
2021-05-05

共1个答案

一尘不染

SQL Server不会短路(也不应短路)。

如果您需要它在某些情况下不 尝试 某些操作,则需要以编写查询的方式强制执行该操作。

对于此查询,最简单的解决方法是CASEWHERE子句中使用表达式。

declare @queryWord as nvarchar(20) = 'asdas'

SELECT  * FROM TABLE_1 
WHERE TABLE_1.INIT_DATE = (CASE WHEN ISDATE(@queryWord) = 1 
                                THEN CONVERT(Date, @queryWord)
                           ELSE NULL  END)

CASE我可以想到仅使用副手和查询嵌套就可以强制对SQL中的依赖条件进行求值顺序的两种受支持的方法。

2021-05-05