SELECTで取得したレコードの件数を取得するCOUNT関数。
特定の条件に合致するレコード数を集計したい時に少し難解な書き方をします。
テーブル
サンプルで使用するテーブルです。
| 名前 | 性別 |
|---|---|
| 田中 | 男 |
| 山田 | 男 |
| 佐藤 | 女 |
| 鈴木 | 男 |
| 武田 | 女 |
| 山本 | 男 |
SQL
SELECT COUNT(性別=男 OR NULL) AS 男の数
, COUNT(性別=女 OR NULL) AS 女の数
FROM テーブル
処理の仕組み
上のSQL、OR NULLって必要?と思いますよね?
PostgreSQLの公式ドキュメントを見ると、下記の記載があります。
count(expression) : expressionが非NULL値を持つ入力値の個数
ですので、上記SQLの性別=男 OR NULLの部分が性別=男だと、性別=男のレコードはTRUE、性別=女のレコードはFALSEとなり、全レコードが非NULL値を持つ入力値としてカウントされます。
OR NULLを付けることによって、性別=男のレコードはTRUE OR NULLでTRUEとなり、性別=女のレコードはFALSE OR NULLでNULLとなり、意図した通りの集計結果となります。
余談
ちなみに、BOOL値とNULLの論理演算の結果は以下の通りです。
TRUE AND NULL → NULL
TRUE OR NULL → TRUE
FALSE AND NULL → FALSE
FALSE OR NULL → NULL