web-dev-qa-db-ja.com

COUNT()集合体が 'NULL'に対して0を返すのはなぜですか?

SELECTステートメントは複数の行を返します。

SELECT
  ColA
FROM
  TableA
WHERE
  ColA IS NULL

TableA内のColAに対して 'NULL'を持つ47行を取得します。

ColA
NULL
NULL
NULL
etc...

このクエリに集計を追加すると、次のようになります。

SELECT
  ColA,
  COUNT(ColA) AS theCount
FROM
  TableA
WHERE
  ColA IS NULL
GROUP BY ColA

私は得る

ColA | theCount
NULL | 0

なぜこれが起こっているのですか?これを回避するにはどうすればよいですか?

6
Zach Smith

集計関数はnull値を無視します。

そう

_SELECT COUNT(cola) AS thecount
FROM tablea
_

に相当

_SELECT count(*) AS thecount
FROM tablea
WHERE cola IS NOT NULL;
_

すべての値がnullであるため、count(cola)はゼロを返す必要があります。

Nullの行をカウントする場合は、count(*)が必要です

_SELECT cola,
       count(*) AS theCount
FROM tablea
WHERE cola is null
GROUP BY cola;
_

またはより単純:

_SELECT count(*) AS theCount
FROM tablea
WHERE cola is null;
_

単一のクエリでNULL and NOT NULL値をカウントする場合は、次を使用します。

_SELECT count(cola) as not_null_count, 
       count(case when cola is null then 1 end) as null_count
FROM tablea;
_
27

これは仕様によるものです。

COUNT(<expression>)は、_<expression>_がnullでない行をカウントします。

COUNT(*)は行をカウントします。

したがって、行をカウントする場合は、COUNT(*)を使用します。

19
ypercubeᵀᴹ