SQL Serverでクエリが何も返さない場合にデフォルト行を設定する方法
SQL Serverでクエリが何も返さない場合にデフォルト行を設定する方法
SELECT ステートメントは、通常、テーブルからデータを取得します。しかし、条件に合致するデータがない場合、何も返さないこともあります。
この場合、デフォルト行を設定することで、常に1行のデータを表示することができます。
方法
デフォルト行を設定するには、次の2つの方法があります。
CASE 式を使用すると、条件に応じて異なる値を返すことができます。
SELECT
CASE WHEN EXISTS (
SELECT *
FROM テーブル
WHERE 条件
) THEN
-- データが存在する場合の値
ELSE
-- データが存在しない場合の値
END AS 列名
FROM テーブル;
UNION ALL は、複数のSELECT ステートメントの結果を結合します。
SELECT
列名
FROM テーブル
WHERE 条件
UNION ALL
SELECT
-- デフォルト行の値
FROM テーブル
WHERE 1 = 0;
例
次の例では、社員
テーブルから、部署ID
が1の社員の情報を取得します。
SELECT
*
FROM 社員
WHERE 部署ID = 1;
このテーブルに、部署ID
が1の社員がいない場合、何も返しません。
CASE 式を使用する例
SELECT
CASE WHEN EXISTS (
SELECT *
FROM 社員
WHERE 部署ID = 1
) THEN
社員名
ELSE
'データなし'
END AS 社員名
FROM 社員;
この例では、社員名
列に、データが存在する場合は社員名、データが存在しない場合は「データなし」と表示されます。
UNION ALL を使用する例
SELECT
社員名
FROM 社員
WHERE 部署ID = 1
UNION ALL
SELECT
'データなし'
FROM 社員
WHERE 1 = 0;
注意事項
- デフォルト行を設定する際は、実際のデータと区別できるように注意する必要があります。
- デフォルト行の値は、実際のデータの型と一致する必要があります。
-- テーブル作成
CREATE TABLE 社員 (
社員ID INT NOT NULL,
社員名 VARCHAR(50) NOT NULL,
部署ID INT NOT NULL
);
-- データ挿入
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (1, '田中', 1);
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (2, '佐藤', 2);
-- クエリ実行
SELECT
CASE WHEN EXISTS (
SELECT *
FROM 社員
WHERE 部署ID = 3
) THEN
社員名
ELSE
'データなし'
END AS 社員名
FROM 社員;
結果
社員名
-------
データなし
-- テーブル作成
CREATE TABLE 社員 (
社員ID INT NOT NULL,
社員名 VARCHAR(50) NOT NULL,
部署ID INT NOT NULL
);
-- データ挿入
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (1, '田中', 1);
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (2, '佐藤', 2);
-- クエリ実行
SELECT
社員名
FROM 社員
WHERE 部署ID = 3
UNION ALL
SELECT
'データなし'
FROM 社員
WHERE 1 = 0;
社員名
-------
データなし
- デフォルト行に複数の列を設定する場合
SELECT
CASE WHEN EXISTS (
SELECT *
FROM 社員
WHERE 部署ID = 3
) THEN
社員名,
部署名
ELSE
'データなし',
'なし'
END AS 社員名, 部署名
FROM 社員;
SELECT
CASE WHEN EXISTS (
SELECT *
FROM 社員
WHERE 部署ID = 3
) THEN
COUNT(*)
ELSE
0
END AS 社員数
FROM 社員;
SQL Serverでクエリが何も返さない場合にデフォルト行を設定するには、CASE 式または UNION ALL を使用することができます。
これらの方法を理解することで、常に1行のデータを表示することができ、データ分析や可視化をより簡単にすることができます。
デフォルト行を設定する他の方法
COALESCE 関数は、最初の引数がNULLの場合、2番目の引数を返します。
SELECT
COALESCE(
(SELECT
列名
FROM テーブル
WHERE 条件),
-- デフォルト値
) AS 列名
FROM テーブル;
-- テーブル作成
CREATE TABLE 社員 (
社員ID INT NOT NULL,
社員名 VARCHAR(50) NOT NULL,
部署ID INT NOT NULL
);
-- データ挿入
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (1, '田中', 1);
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (2, '佐藤', 2);
-- クエリ実行
SELECT
COALESCE(
(SELECT
社員名
FROM 社員
WHERE 部署ID = 3),
'データなし'
) AS 社員名
FROM 社員;
社員名
-------
データなし
SELECT
CASE WHEN ISNULL(
(SELECT
列名
FROM テーブル
WHERE 条件)
) THEN
-- デフォルト値
ELSE
(SELECT
列名
FROM テーブル
WHERE 条件)
END AS 列名
FROM テーブル;
-- テーブル作成
CREATE TABLE 社員 (
社員ID INT NOT NULL,
社員名 VARCHAR(50) NOT NULL,
部署ID INT NOT NULL
);
-- データ挿入
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (1, '田中', 1);
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (2, '佐藤', 2);
-- クエリ実行
SELECT
CASE WHEN ISNULL(
(SELECT
社員名
FROM 社員
WHERE 部署ID = 3)
) THEN
'データなし'
ELSE
(SELECT
社員名
FROM 社員
WHERE 部署ID = 3)
END AS 社員名
FROM 社員;
社員名
-------
データなし
PIVOT テーブルは、データを集計して別の形式で表示するために使用できます。
SELECT
*
FROM
(
SELECT
列名,
COUNT(*) AS 件数
FROM テーブル
WHERE 条件
GROUP BY 列名
) AS t
PIVOT
(
SUM(件数)
FOR 列名 IN (
-- デフォルト値
)
) AS p;
-- テーブル作成
CREATE TABLE 社員 (
社員ID INT NOT NULL,
社員名 VARCHAR(50) NOT NULL,
部署ID INT NOT NULL
);
-- データ挿入
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (1, '田中', 1);
INSERT INTO 社員 (社員ID, 社員名, 部署ID) VALUES (2, '佐藤', 2);
-- クエリ実行
SELECT
*
FROM
(
SELECT
部署ID,
COUNT(*) AS 件数
FROM 社員
GROUP BY 部署ID
) AS t
PIVOT
(
SUM(件数)
FOR 部署ID IN (
1,
2,
3
)
) AS p;
部署ID 1 2 3
------- - - -
1 1 0 0
2 0 1 0
仮想テーブルを使用する
仮想テーブルは、実際に存在しないテーブルを一時的に作成するために使用できます。
CREATE TABLE #temp (
列名 型
);
INSERT INTO #temp (
-- デフォルト値
);
SELECT
*
FROM テーブル
WHERE 条件
UNION ALL
SELECT
*
FROM #temp;
DROP TABLE #temp;
-- テーブル作成
CREATE TABLE
sql sql-server