23

これは、Microsoft Sql Server で見つけた奇妙な動作に関するものです。私が間違っている場合は、私を修正してください。

SELECT COUNT(*) FROM TABLEA 
WHERE [Column1] IS NULL;

これは 30018 行を返します。

CREATE VIEW VIEWB AS 
SELECT * FROM TABLEA AS t1 
WHERE t1.[Column1] NOT IN ('Cross/Up sell', 'Renegotiation', 'Renewal')  

をチェックすると、VIEWBが見つかりません:NULLColumn1

SELECT COUNT(*) FROM VIEWB 
WHERE [Column1] IS NULL;

これは 0 行を返します。

なんで?上記のクエリは 3 つの値を除外していますが、 NULL を除外することは想定されていません。Ms Sql Server がこのように動作するのはなぜですか? 私はこれを期待すべきでしたか?どうすれば修正できますか?

4

4 に答える 4

29

これは、SQL Server で NULL を値として扱う際によくある間違いです。こちらに記載されているように、デフォルトでは UNKNOWN として扱われます。したがって、ビューには . も含める必要がありますOR t1.[Column1] IS NULL

を呼び出すことで、この動作を変更できますSET ANSI_NULLS OFF。ただし、@Martin Smith によって指摘されているように、この機能は非推奨であるため、これを使用することはお勧めしません。

ただし、これは SQL Server 固有の問題ではありません。ANSI SQL 標準の一部です。

于 2012-07-15T12:26:40.330 に答える
13

SQL は3 つの値を持つロジックを使用します。

t1.[Column1] NOT IN ('Cross/Up sell', 'Renegotiation', 'Renewal') 

と同等です

t1.[Column1] <> 'Cross/Up sell' AND  
t1.[Column1] <> 'Renegotiation' AND 
t1.[Column1] <>  'Renewal')

この式がそうではなくt1.[Column1] is NULL評価された場合、これらの行は返されません。UNKNOWNTRUE

NULL NOT IN ( ... )返されるのは、NOT IN句が空のセットに評価された場合のみです。

于 2012-07-15T12:25:36.570 に答える
1

対処する際の注意の別の例nulls

私は Sumo に同意します。ビューを次のように変更してみませんか。

CREATE VIEW VIEWB AS 
SELECT * FROM TABLEA AS t1 
WHERE 
    t1.[Column1] NOT IN ('Cross/Up sell', 'Renegotiation', 'Renewal')  
    OR
    t1 IS NULL 

代替手段は、SQL FIDDLEに追加した次の可能性があります

CREATE VIEW VIEWB AS 
SELECT * FROM TABLEA AS t1 
WHERE 
    1 = CASE 
          WHEN ISNULL(t1.[Column1],'x') NOT IN ('Cross/Up sell', 'Renegotiation', 'Renewal') THEN 1
          ELSE 0
        END
于 2012-07-15T17:02:26.683 に答える