我一直在努力优化查询,并遇到了让我质疑我是如何一直使用SQL的OR运算符的情况.(也是SQL Server 2000)
我有一个查询,其中条件(WHERE)子句看起来像这样:
WHERE (Column1 = @Param1 or Column1 LIKE @Param1 + '%') AND (@Param2 = '' OR Column2 = @Param2 OR Column2 LIKE @Param2 + '%')
现在,我一直都知道SQL中的OR评估了两个表达式.因此,对于左表达式计算为true的所有记录将与在右表达式上计算为true的所有记录一起返回.例如:
SELECT * FROM TABLE1 WHERE COL1 = 'Test' OR Col2 = 'Data'
这将返回COL1为'Test'的所有记录以及Col2为'Data'的任何记录
在上面的示例中,我将Column2条件修改为以下内容:
AND(Column2 LIKE ISNULL(@Param2, '') + '%')
突然间,我得到0行返回.
我是否误解了OR只评估表达式,直到它找到一个真实的结果或是否有一个条件会导致2个不同的结果返回不同的结果?
"OR只评估表达式,直到找到TRUE结果"
它只需要,但这不是你的问题(实际上这就是你在原始情况下拯救你的东西).你的两个查询并不是真正等同的.
我认为你NULL
在Column2中有一个永远不会(Column2 LIKE ISNULL(@Param2, '') + '%')
成为真实的东西 - 并且在你的原始版本@Param2 = ''
中掩盖了这种情况,因为它是真的(有时候)
也许:
(ISNULL(Column2, '') LIKE ISNULL(@Param2, '') + '%')
记住NULL的三值逻辑:
TRUE and UNKNOWN: UNKNOWN TRUE or UNKNOWN: TRUE FALSE and UNKNOWN: FALSE FALSE or UNKNOWN: UNKNOWN
但我不确定你的优化是否真的有帮助.