最近我们发现了一个长时间运行的过程,我的一位同事指出,由于这篇文章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%确定它不能,我们只是不知道它。
答案 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)
这种改变没问题。
NULL
或0
都不等于1
,因此结果会相同。
答案 2 :(得分:0)
如果您不包含,则MemberId可以为空,您将无法获得任何匹配 “IS NOT NULL”但我认为这是一个不同的问题?也许不是吗?
不,不是。您必须在内部查询的MemberID
子句中测试可为空的WHERE
值。如果NULL
表中有任何MemberID
值Person
,您将无法获得任何值。如果您使用LEFT JOIN
代替WHERE leftids IS NULL
谓词而不是IN
谓词,可能会更好一些。