CASE式とIS NULL/IS NOT NULL演算子を使ったグループ化
SQLでレコードをNULLとNOT NULLでグループ化する
CASE式を使用する
CASE式を使用して、NULLとNOT NULLの値を別々のグループに分割できます。次の例では、column1
カラムに基づいてレコードをグループ化しています。
SELECT
CASE WHEN column1 IS NULL THEN 'NULL' ELSE 'NOT NULL' END AS group,
COUNT(*) AS count
FROM table
GROUP BY group;
このクエリは、次の結果を返します。
group | count
-------|-------
NULL | 10
NOT NULL | 20
IS NULLとIS NOT NULLを使用する
SELECT
CASE WHEN column1 IS NULL THEN 'NULL'
WHEN column1 IS NOT NULL THEN 'NOT NULL'
END AS group,
COUNT(*) AS count
FROM table
GROUP BY group;
このクエリは、上記のCASE式を使用する例と同じ結果を返します。
どちらの方法を使用するかは、好みと可読性の問題です。 CASE式は、より明確で読みやすいコードになる可能性がありますが、IS NULLとIS NOT NULLを使用する方が簡潔になる場合があります。
- GROUP BY句で複数の列を指定できます。
- 集計関数(COUNT、SUM、AVGなど)を使用して、グループ内のデータの要約統計を計算できます。
- HAVING句を使用して、グループ化された結果に対してフィルター処理を行うことができます。
-- テーブルの作成
CREATE TABLE my_table (
id INT,
column1 VARCHAR(255),
column2 INT
);
-- データの挿入
INSERT INTO my_table (id, column1, column2) VALUES
(1, 'John Doe', 10),
(2, NULL, 20),
(3, 'Jane Doe', 30),
(4, NULL, 40),
(5, 'Peter Smith', 50);
-- CASE式を使用する
SELECT
CASE WHEN column1 IS NULL THEN 'NULL' ELSE 'NOT NULL' END AS group,
COUNT(*) AS count
FROM my_table
GROUP BY group;
-- 結果
--
-- group | count
-- -------|-------
-- NULL | 2
-- NOT NULL | 3
-- IS NULLとIS NOT NULLを使用する
SELECT
CASE WHEN column1 IS NULL THEN 'NULL'
WHEN column1 IS NOT NULL THEN 'NOT NULL'
END AS group,
COUNT(*) AS count
FROM my_table
GROUP BY group;
-- 結果
--
-- group | count
-- -------|-------
-- NULL | 2
-- NOT NULL | 3
このコードを実行すると、次の結果が表示されます。
group | count
-------|-------
NULL | 2
NOT NULL | 3
この例では、my_table
というテーブルに、id
、column1
、column2
という3つのカラムがあります。column1
カラムには、NULL値とNOT NULL値の両方が含まれています。
COALESCE関数を使用して、NULL値を別の値に置き換えることができます。次の例では、NULL値を'Unknown'
という文字列に置き換えています。
SELECT
COALESCE(column1, 'Unknown') AS group,
COUNT(*) AS count
FROM my_table
GROUP BY group;
group | count
-------|-------
Unknown | 2
John Doe | 1
Jane Doe | 1
Peter Smith | 1
GROUP BY ALLを使用する
GROUP BY ALL句を使用して、NULL値を含むグループも含めてすべてのグループをグループ化できます。次の例では、column1
カラムとcolumn2
カラムに基づいてレコードをグループ化しています。
SELECT
column1,
column2,
COUNT(*) AS count
FROM my_table
GROUP BY ALL column1, column2;
column1 | column2 | count
-------|---------|-------
NULL | NULL | 2
John Doe | 10 | 1
Jane Doe | 30 | 1
Peter Smith | 50 | 1
この方法を使用すると、NULL値を含むグループを個別に識別できます。
サブクエリを使用する
SELECT
group,
COUNT(*) AS count
FROM (
SELECT
CASE WHEN column1 IS NULL THEN 'NULL' ELSE 'NOT NULL' END AS group
FROM my_table
) AS t
GROUP BY group;
sql null group-by