删除此ISNULL语句是否存在任何潜在问题?

时间:2012-11-08 14:19:50

标签: sql sql-server sql-server-2008 tsql query-optimization

最近我们发现了一个长时间运行的过程,我的一位同事指出,由于这篇文章Is there is any Performance issue while using ISNULL() in SQL Server?中指出的原因,将ISNULL放在where子句中加快了速度。我做了一些Google搜索,但无法确定是否存在丢失数据的危险。我知道你是否说过这样的话

WHERE ID NOT IN (SELECT MemberID FROM Person WHERE MemberId IS NOT Null)

并且MemberId可以为空,如果你不包含“IS NOT NULL”,你将不会获得任何匹配但我认为这是一个不同的问题?也许不吧?

这是我的同事提议的改变。

where ISNULL(ct.DisabilityBenefitsConnectAuthorized,0) = 1

会变成

where ct.DisabilityBenefitsConnectAuthorized = 1

它似乎没有影响结果,但我不是100%确定它不能,我们只是不知道它。

3 个答案:

答案 0 :(得分:3)

为什么不尝试使用简化的示例,例如:

declare @x bit

--@x is currently null
if isnull(@x,0)=1 begin print 'is one!' end else begin print 'not one!' end
if @x=1 begin print 'is one!' end else begin print 'not one!' end

set @x=0
if isnull(@x,0)=1 begin print 'is one!' end else begin print 'not one!' end
if @x=1 begin print 'is one!' end else begin print 'not one!' end

set @x=1
if isnull(@x,0)=1 begin print 'is one!' end else begin print 'not one!' end
if @x=1 begin print 'is one!' end else begin print 'not one!' end

输出:

not one!
not one!
not one!
not one!
is one!
is one!

基于上面的内容,看起来你可以删除ISNULL()

答案 1 :(得分:1)

这种改变没问题。

NULL0都不等于1,因此结果会相同。

答案 2 :(得分:0)

  

如果您不包含,则MemberId可以为空,您将无法获得任何匹配   “IS NOT NULL”但我认为这是一个不同的问题?也许不是吗?

不,不是。您必须在内部查询的MemberID子句中测试可为空的WHERE值。如果NULL表中有任何MemberIDPerson,您将无法获得任何值。如果您使用LEFT JOIN代替WHERE leftids IS NULL谓词而不是IN谓词,可能会更好一些。