0

最近、長時間実行される proc を発見し、私の同僚の 1 人が、この投稿で指摘されている理由で、where 句で ISNULL を削除すると速度が向上したことを指摘しました. Google で検索しましたが、データの欠落に危険性があるかどうかはわかりませんでした。こんなこと言われたらわかる

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

「IS NOT NULL」を含めないと一致しませんが、それは別の問題だと思いますか? そうでないかもしれない?

これが私の同僚が提案している変更です。

where ISNULL(ct.DisabilityBenefitsConnectAuthorized,0) = 1

なるだろう

where ct.DisabilityBenefitsConnectAuthorized = 1

結果に影響を与えているようには見えませんが、100% 影響がないという確信はありません。

4

3 に答える 3

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() を削除できるようです

于 2012-11-08T14:37:32.387 に答える
1

その変更は問題ありません。

どちらでもないNULLか、に0等しくない1ため、結果は同じになります。

于 2012-11-08T14:22:21.940 に答える
0

MemberId は null 可能です。「IS NOT NULL」を含めないと一致しませんが、それは別の問題だと思いますか? そうでないかもしれない?

いいえそうではありません。内部クエリの句でnull 許容MemberID値をテストする必要があります。テーブルに値がWHEREある場合、値は取得されません。述語の代わりにwithを使用した方が安全かもしれません。NULLMemberIDPersonLEFT JOINWHERE leftids IS NULLIN

于 2012-11-08T14:22:35.623 に答える