删除此 ISNULL 语句是不是有任何潜在问题?

Posted

技术标签:

【中文标题】删除此 ISNULL 语句是不是有任何潜在问题?【英文标题】:Is there any potential issue removing this ISNULL statement?删除此 ISNULL 语句是否有任何潜在问题? 【发布时间】:2012-11-08 14:19:50 【问题描述】:

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

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% 确定它不会,我们只是不知道。

【问题讨论】:

【参考方案1】:

为什么不自己尝试一个简化的例子,比如:

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()

【讨论】:

是的,经验方法也有其价值。 因为我不够聪明,无法提出这个漂亮的测试!幸运的是你在哪里,它确实证明没有问题。谢谢!【参考方案2】:

这种变化会很好。

NULL0 都不等于 1,因此结果将是相同的。

【讨论】:

【参考方案3】:

MemberId 可以为空,如果不包含,您将不会得到任何匹配项 “不为空”,但我认为这是一个不同的问题?也许不是?

不,不是。您必须在内部查询的WHERE 子句中测试可空的MemberID 值。如果Person 表中有任何NULLMemberID,您将不会获得任何值。如果您将LEFT JOINWHERE leftids IS NULL 一起使用而不是IN 谓词可能会更好,它更安全。

【讨论】:

以上是关于删除此 ISNULL 语句是不是有任何潜在问题?的主要内容,如果未能解决你的问题,请参考以下文章

sql server的sql语句怎么判断一个字段是不是为空

为啥我在使用 isNull 时收到此错误消息

sql server where 字段 is null 的问题

sql优化

将“异步”方法绑定到“开启”事件(例如单击)时是不是存在任何潜在问题?

sql优化