我一直工作在优化查询,并跑进多数民众赞成让我怀疑我怎么一直使用SQL或操作的情况。 (SQL Server 2000还)

我有一个查询,其中所述条件(WHERE)子句看起来像这样:

WHERE (Column1 = @Param1 or Column1 LIKE @Param1 + '%')
AND (@Param2 = '' OR Column2 = @Param2 OR Column2 LIKE @Param2 + '%')

现在,我一直明白,或SQL评估两个表达式。因此,对于左表达式计算真正的所有记录将与右边表达式计算真正的所有记录一起返回。例如:

SELECT * FROM TABLE1
WHERE COL1 = 'Test' OR Col2 = 'Data'

这将返回回所有记录COL1 is'Test”以及其中是Col2中的任何记录‘数据’

在上面的例子中,我修改将Column条件为以下:

AND(Column2 LIKE ISNULL(@Param2, '') + '%')

突然之间,我得到0行返回。

让我被误认为在OR直到它找到一个真正的结果,或者是存在会导致不同的2到返回不同的结果的情况只计算表达式?

有帮助吗?

解决方案

“或仅计算表达式,直到它找到一个TRUE结果”

它只有到,但是这不是你的问题(其实这是什么拯救你在原来的情况下)。你的两个查询是不是真的等价的。

我想你在列2 NULLs这将不会导致(Column2 LIKE ISNULL(@Param2, '') + '%')是真实的 - 在你的原始版本@Param2 = ''的掩蔽这种情况下,因为它是真实的(有时)

也许:

(ISNULL(Column2, '') LIKE ISNULL(@Param2, '') + '%')

记住空值的三值逻辑:

TRUE and UNKNOWN: UNKNOWN
TRUE or UNKNOWN: TRUE

FALSE and UNKNOWN: FALSE
FALSE or UNKNOWN: UNKNOWN

但我不知道你的优化是真正帮助。

其他提示

或不是包罗万象,尤其是因为它是在括号中。你有因为较大的是:WHERE X AND Y。这一事实,X和Y是本身布尔表达式,使使用的OR的并不重要:它们被分别评估,然后结果被馈送到AND运算

[编辑]:点击 再次阅读,我可能误解了你的问题。考虑到这一点,我就必须去与对方的回答,因为NULL LIKE '%'返回NULL,这是一样的在这种情况下错误的。你可以试试这个:

COALESCE(Column2,'') LIKE COALESCE(@param2,'') + '%'

仅供参考,有很简单的实验,你可以做地看到,并不是所有的条件都必然评估。

我这样做是在甲骨文,但我希望你将有一个类似的结果在SQL Server中。

dev> select * from dual where 1=1 or 1/0 = 3;

D
-
X

的或之后的条件不能被评估,因为它会提高一个除以零误差。

布尔操作符的这种处理通常被称为“短路”和,AFAIK,是在现代语言非常标准。它也可以适用于AND表达式 - 如果所述第一条件是假,则在评估第二条件没有意义的,因为整个表达式不可能是TRUE

更多信息: http://en.wikipedia.org/wiki/Short-circuit_evaluation

反正作为凯德说,你真正的问题可能是处理不当的NULL。

MS-SQL将首先评估的左手侧,而不是继续进行,除非它需要。

这是与和连接相同,左侧将被评估,并且如果假的权利也不会被evaulated。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top