Sql 为什么比较NOT(x=0)和NOT(x=NULL)返回相同的值?

Sql 为什么比较NOT(x=0)和NOT(x=NULL)返回相同的值?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,使用以下数据: ItemID PrivateSales PublicSales TotalSales SalesPerson ----------- ----------------------- ----------------------- ---------------------------- ----------------------------- 1 300

使用以下数据:

ItemID      PrivateSales            PublicSales             TotalSales                   SalesPerson
----------- ----------------------- ----------------------- ---------------------------- -----------------------------
1           300                     400                     700                          12
1           NULL                    10                      10                           12
2           NULL                    NULL                    NULL                         NULL
3           NULL                    NULL                    NULL                         NULL
6           20                      900                     920                          11
8           22                      18                      40                           10
9           20                      980                     1000                         11
22          NULL                    NULL                    NULL                         NULL
11          NULL                    NULL                    NULL                         NULL
15          40                      NULL                    40                           77
16          12                      NULL                    12                           NULL
44          NULL                    44                      44                           23
当我运行以下两个不同的查询时,得到的结果完全相同:

 SELECT TOP 1000 [ItemID]
    ,[PrivateSales]
    ,[PublicSales]
    ,[TotalSales]
    ,[SalesPerson]
FROM [Sales]
WHERE NOT (
    PrivateSales IS NULL
    AND PublicSales IS NULL
    AND TotalSales IS NULL
    )
以及:

考虑到
NULL
列,为什么
WHERE NOT(x=0)
不返回
NULL
列? *Sales列是十进制类型,如果这很重要的话。

请参阅此项了解空值

将任何true或false值与null值进行比较都会得到null值,实际上,您需要对不会产生true或false的null值求反 它不返回空值,因为空值未确定,因此不满足不等于0或不等于0(未知)的条件

比较NOT(x=0)和NOT(x=NULL)应该是

 NOT (x= 0) And x is not null

x0和x不为空
重申秘书长的意见


“NULL with,!=,=,始终为NULL。Period.NOT(x=0)与x0相同”

排除中间法则,也就是说,A是否是同义反复,随着第三个真值NULL的引入而丢失。SQL Server实现这一事实的目的是将布尔空值解释为未知值;传播未知信息;并将未知合并为假,除非已对未知(也称为空)进行了明确测试。

NULL
,!=,=始终为空。句号
NOT(x=0)
x0
相同,因此当x为NULL时不会返回。至少在SQLAnywhere(我猜是ASE)上,有一个名为ansinull的选项,它正在为compat更改此选项。原因。我不知道SQL小姐,但可能和它有关。(因此改变了stadard SQL的行为)是的,有,但请别管它
当SET ANSI_NULLS处于启用状态时,使用WHERE column_name=NULL的SELECT语句返回零行,即使column_name中有空值。
从未想过这是好的,但可能会解释上述行为。
 NOT (x= 0) And x is not null
x<>0 and x is not null