2

根据 MSDN,TSQL COUNT(*) 函数在结果中包含任何 NULL 值,除非还使用 DISTINCT(来源:http: //msdn.microsoft.com/en-us/library/ms175997.aspx

但是,在我的查询中,NULL 值被忽略了。为了测试这一点,我创建了一个小表并在其中填充了一些数据:

CREATE TABLE tbl (colA varchar(1), colB varchar(10))
INSERT tbl VALUES
('Y', 'test1'),
('Y', 'test2'),
(null, 'test3'),
(null, 'test4'),
('N', 'test5')

然后我对其运行了以下 2 个查询:

SELECT count(*) FROM tbl
WHERE colA <> 'N'

SELECT DISTINCT colA FROM tbl
WHERE colA <> 'N'

两个结果都忽略了 NULL 值。我分别得到 2 和 'Y' 作为结果。我不知道为什么会这样。有人可以告诉我吗?

在 SQL Fiddle 中模拟的结果:http ://sqlfiddle.com/#!3/8f00b/9

4

6 回答 6

5

空值很奇怪。

null <> 'N'评估为false
null = 'N'也评估为false

您需要明确处理 null :

SELECT count(*) FROM tbl
WHERE (colA <> 'N') or (colA is null)
于 2012-09-10T22:14:36.680 回答
2

除 IS NULL 之外的任何与 Null 的比较都将失败。所以 Null = 'N' 和 Null <> 'N' 都返回 false。

如果你想包含空值,你需要说

WHERE colA <> 'N' or colA IS NULL
于 2012-09-10T22:15:02.453 回答
2

因为NULL未知,所以服务器不知道它的值是什么。但尝试使用IS NULL

SELECT count(*) 
FROM tbl
WHERE colA <> 'N' or  
      colA IS NULL

SQLFiddle 演示

于 2012-09-10T22:15:44.940 回答
2
declare @tbl as Table (colA varchar(1), colB varchar(10)) 
insert @tbl values 
  ('Y', 'test1'), ('Y', 'test2'), (null, 'test3'), (null, 'test4'), ('N', 'test5')
select * from @tbl

select
  count(*) as 'Rows', -- All rows.
  count(colA) as [colA Values], -- Rows where   colA   is not NULL.
  count(colB) as [colB Values],  -- Rows where   colB   is not NULL.
  count(distinct colA) as [Distinct colA], -- Number of distinct values in   colA .
  count(distinct colB) as [Distinct colB], -- Number of distinct values in   colB .
  -- NULL never equals anything, including another NULL.
  case when 42 = NULL then 'Yes' else 'Unknown' end as [Answer Is NULL?],
  case when NULL = NULL then 'Yes' else 'Unknown' end as [NULL = NULL],
  -- Use   is NULL   to explicitly check for   NULL .
  case when NULL is NULL then 'Yes' else 'Unknown' end as [NULL is NULL]
  from @tbl
于 2012-09-10T23:23:55.063 回答
2
 select count(IsNull(colA,'')) as colA, count(colB) as colB from @tbl

也应该做的伎俩

于 2013-03-02T13:34:04.723 回答
1

您还可以使用ISNULL功能:

SELECT count(*) 
FROM tbl
WHERE isnull(colA,'F') <> 'N' 

MSDN: http: //msdn.microsoft.com/en-us/library/aa933210 (v=sql.80).aspx

于 2012-09-11T11:34:27.757 回答