为什么与<>进行SQL比较?不返回具有NULL值的行

时间:2014-01-31 17:48:40

标签: sql sql-server

假设表格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值的行不会出现在结果集中?

有人可以解释这种行为吗?

5 个答案:

答案 0 :(得分:2)

ANSI-92 SQL标准规定,如果其中一个操作数为NULL,则比较结果为“UNKNOWN” - 不是true或false。

要详细了解NULL在SQL中的工作方式,请参阅4 Simple Rules for Handling SQL NULLs

SQL Fiddle

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 NULLIS 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)