MSDN 说BIT类型可以存储值 0、1 或 NULL。(BIT 值为 NULL 的事实必须与位值本身分开存储,因为可以压缩位值,以便将 8 个 BIT 值存储在一个字节中。)
请记住,当条件为 TRUE 时,WHERE 子句中的条件会选择一行。对于大多数二元谓词(条件),如果将 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,则 IS NULL 测试返回 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
因此,在您的第二个查询中,只会选择bit_column_value
值为 NULL(与 0 和 1 分开)的行——不是 TRUE,也不是 FALSE。
我正在尝试检索此位列为 NULL 或 NOT TRUE 的所有行。
尝试直接从您的规范编写查询:
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 将产生您想要的结果——主要的警告是我不确定 MS SQL Server 是否支持 IS [NOT] {TRUE|FALSE|UNKNOWN}。从 MSDN on Predicates判断,不支持 IS [NOT] {TRUE|FALSE|UNKNOWN} 谓词(但我可能错过了手册的正确部分)。如果正确,您需要使用查询 2 或 3 之一。
(当值不是简单的列而是行值时,这些谓词会有一些额外的复杂性。但是,这与您的问题或问题无关;由于 MS SQL Server 似乎不支持它们,因此更是如此。)