Help us understand the problem. What is going on with this article?

【SQL】COUNT関数で条件に合致する件数を取得する

More than 1 year has passed since last update.

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away