MSDNによると、BITタイプは0、1、またはNULLの値を格納できます。(ビット値が1バイトに格納されるようにビット値を圧縮できるため、ビット値がNULLであるという事実は、ビット値自体とは別に格納する必要があります。)
WHERE句の条件は、条件がTRUEのときに行を選択することに注意してください。ほとんどのバイナリ述語(条件)では、NULLをある値と比較すると、結果はNULLまたはUNKNOWN(TRUEではない)になります。したがって、たとえば、列の値がNULLの場合、column = 0
NULLまたはUNKNOWNと評価され、同様に評価されますcolumn <> 0
。
あなたの質問を見てください:
SELECT * FROM table WHERE bit_column_value <> 1
列の値bit_column_value
が1の場合、条件はFALSEであるため、行は返されません。値が0の場合、条件はTRUEであるため、行が返されます。値がNULLの場合、条件もNULLまたはUNKNOWNであるため、行は返されません。
SELECT * FROM table WHERE bit_column_value IS NULL
SQL標準によれば、IS[NOT]NULL述部と関連するIS[NOT]{TRUE | FALSE|UNKNOWN}述部はわずかに異なります。テストされた値がNULLの場合、ISNULLテストはTRUEを返します。それ以外の場合は、FALSEを返します(UNKNOWNを返すことはありません)。IS [NOT] {TRUE | FALSE|UNKNOWN}テストも同様です。値が指定されたタイプの場合はTRUEを返し、それ以外の場合はFALSEを返します(UNKNOWNではありません)。例えば:
Column IS TRUE IS FALSE IS UNKNOWN IS NOT TRUE IS NOT FALSE IS NOT UNKNOWN
FALSE FALSE TRUE FALSE TRUE FALSE TRUE
TRUE TRUE FALSE FALSE FALSE TRUE TRUE
NULL FALSE FALSE TRUE TRUE TRUE FALSE
したがって、2番目のクエリでは、bit_column_value
値がNULL(0と1の両方から分離されている)の行のみが選択されます。TRUEでもFALSEでもありません。
このビット列がNULLまたはNOTTRUEのすべての行を取得しようとしています。
仕様から直接クエリを記述してみてください。
SELECT * FROM table WHERE bit_column_value IS NULL OR bit_column_value IS NOT TRUE
SELECT * FROM table WHERE bit_column_value IS NULL OR bit_column_value = FALSE
SELECT * FROM table WHERE bit_column_value IS NULL OR bit_column_value <> TRUE
SELECT * FROM table WHERE bit_column_value IS NOT TRUE
上記の真理値表を考えると、クエリ4は希望する結果をもたらします。ただし、MSSQLServerがIS[NOT]{TRUE | FALSE|UNKNOWN}をサポートしているかどうかはわかりません。述語に関するMSDNから判断すると、IS [NOT] {TRUE | FALSE | UNKNOWN}述語はサポートされていません(ただし、マニュアルの正しい部分を見逃している可能性があります)。それが正しければ、クエリ2または3のいずれかを使用する必要があります。
(値が単純な列ではなく行の値である場合、これらの述語にはいくつかの追加の問題があります。ただし、それは質問や問題とは関係ありません。MSSQL Serverがそれらをサポートしていないように見えるためです。)