假设表格X如此:
A | B
----------------
2 pqr
3 xyz
*NULL* abc
当我执行如下查询时:
SELECT *
FROM X
WHERE A <> 2
我期待这样的结果集:
A | B
----------------
3 xyz
*NULL* abc
但令我惊讶的是,我得到了这样的结果集:
A | B
----------------
3 xyz
为什么带有NULL
值的行不会出现在结果集中?
有人可以解释这种行为吗?
答案 0 :(得分:2)
ANSI-92 SQL标准规定,如果其中一个操作数为NULL,则比较结果为“UNKNOWN” - 不是true或false。
要详细了解NULL在SQL中的工作方式,请参阅4 Simple Rules for Handling SQL NULLs
MS SQL Server 2008架构设置:
CREATE TABLE X
([A] int, [B] varchar(3))
;
INSERT INTO X
([A], [B])
VALUES
(2, 'pqr'),
(3, 'xyz'),
(NULL, 'abc')
;
查询1 :
SELECT *
FROM X
WHERE A IS NULL OR A <> 2
<强> Results 强>:
| A | B |
|--------|-----|
| 3 | xyz |
| (null) | abc |
答案 1 :(得分:0)
由于{3}状态逻辑中的null <> 2
返回未知,因为谓词将其视为错误。
答案 2 :(得分:0)
NULL
未使用=或&lt;&gt;进行比较。请查看此NULL COMPARISON文章。 NULLS会比较为IS NULL
或IS NOT NULL
。
答案 3 :(得分:0)
您需要处理NULL ...如果任何操作数为NULL,则比较结果为NULL。
如果您尝试这样的事情:
SELECT * FROM X WHERE isnull(A,'NULL') <> 2
您可能会得到您期望的结果(如果A是varchar字段)......
如果A是数字字段,您可以尝试:
SELECT * FROM X WHERE isnull(A,0) <> 2
答案 4 :(得分:0)
如果您是视觉学习者,请运行此查询:
SELECT
a,
b,
CASE
WHEN a <> b THEN 'a <> b'
WHEN a = b THEN 'a = b'
ELSE 'neither'
END
FROM
(VALUES (0),(1),(NULL)) a(a),
(VALUES (0),(1),(NULL)) a(b)