首先SQL SERVER 是一个三值逻辑 即谓词计算结果为TRUE,FALSE,UNKNOWN
标准的谓词都是遵循这种规则的
如 slary>0 会返回计算结果为TRUE 结果的行拒绝FALSE和UNKNOWN 结果
但不是所有的谓词处理都是这样的 如果出现在CHECK约束中 计算结果为不为FALSE 拒绝FALSE 意味着接受TRUE和UNKNOWN
TRUE 和FALSE 我们都知道什么意思 那 UNKNOWN 具体怎么避免呢?
1.UNKNOWN
IS UNKNOWN 得到结果 NULL 这很正常 NOT IS 取反结果 还NULL 这让人很费解 NOT UNKNOWN依旧等于UNKNOWN
NULL=NULL 计算结果为UNKNOWN NULL表示缺失,简单点说就是 一未知的值不可能等于另一个未知的值
所以 SQL 提供两个谓词 来判断是不是NULL IS NULL 和 IS NOT NULL 替代=NULL <>NULL
记住 <> 计算结果不包括空 例如
SELECT custid, country, region, city FROM Sales.Customers WHERE region <> N'WA';
可以看到第一幅图并无NULL 行
接着我们查询为NULL的
SELECT custid, country, region, city FROM Sales.Customers WHERE region = NULL;
所以我们用 IS NULL 代替 =
SELECT custid, country, region, city FROM Sales.Customers WHERE region IS NULL;
如果想反回 不等于 wa 包括NULL
SELECT custid, country, region, city FROM Sales.Customers WHERE region <> N'WA' OR region IS NULL;
奇怪的是 在分组和排序谓词中 NULL=NULL 是成立的
在 唯一约束中 NULL 也是被认为相等的