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