ほんの少しハマったことを共有。
考えてみれば当たり前のことでしたが、COUNT文なんて間違いようがないだろうと思っているとドツボにハマります。
(DBはOracleで再現しましたがどのDBMSでも同様かなと思います。)
やりたかった事
nullのレコード件数を取得したかった。
例として以下のテーブルで、DATA2の列がnullのレコード件数を取得するということを考えます。
テーブル例
EXAMPLE_TABLE
ID | DATA1 | DATA2 |
---|---|---|
1 | a | A |
2 | b | null |
3 | c | C |
駄目だったSQL
bad.sql
select COUNT(DATA2) from EXAMPLE_TABLE where DATA2 is NULL;
結果:0
正解SQL
こうあるべき
good.sql
select COUNT(ID) from EXAMPLE_TABLE where DATA2 is NULL;
結果:1
結論
COUNT文に指定したカラムがnullの場合はカウントされません!
教科書的に、「COUNT文にはキー項目や*、定数('x',1等)を指定しましょう」というのに従いましょう。
仕組みとしては、COUNT(NULL)と評価されて、NULLはいかなる真偽値検査もfalseとなるためCOUNTもされなくなります。
何の気なしに、where句で指定したカラム使っちゃえとしたのが間違いでした。