SQL Server 2008 での CASE WHEN 条件の複数使用の代替方法
SQL Server 2008 での CASE WHEN 条件の複数使用について
CASE WHEN ステートメントは、SQL Server 2008 で条件に基づいて異なる値を返すために使用されます。複数の条件を評価して異なる結果を返す必要がある場合は、CASE WHEN ステートメントをネストするか、複数のCASE WHEN ステートメントを組み合わせることができます。
ネストされた CASE WHEN ステートメント
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END
この例では、condition1
が真の場合には result1
が、condition2
が真の場合には result2
が、それ以外の場合は result3
が返されます。
複数の CASE WHEN ステートメントの組み合わせ
CASE WHEN condition1 THEN result1
END + CASE WHEN condition2 THEN result2
END
この例では、condition1
と condition2
の両方が真の場合、result1
と result2
の合計が返されます。
例:
SELECT
ProductID,
ProductName,
UnitPrice,
CASE WHEN UnitPrice < 20 THEN 'Low'
WHEN UnitPrice >= 20 AND UnitPrice < 50 THEN 'Medium'
ELSE 'High'
END AS PriceCategory
FROM Products;
このクエリでは、UnitPrice
を基に製品を低、中、高の価格カテゴリに分類します。
注意:
- ELSE 句は、すべての条件が偽の場合に実行されます。
- CASE WHEN ステートメントは、通常、SELECT ステートメントの列リストで使用されますが、WHERE 句や HAVING 句でも使用できます。
- 複数のCASE WHEN ステートメントを組み合わせる場合は、適切な演算子(例えば、
+
,-
,*
,/
) を使用して結果を結合してください。
SELECT
ProductID,
ProductName,
UnitPrice,
CASE WHEN UnitPrice < 20 THEN 'Low'
WHEN UnitPrice >= 20 AND UnitPrice < 50 THEN 'Medium'
ELSE 'High'
END AS PriceCategory
FROM Products;
この例では、Products
テーブルから製品情報を取得し、UnitPrice
を基に価格カテゴリを決定します。
- CASE WHEN ステートメントは、
UnitPrice
の値に基づいて価格カテゴリを判断します。 UnitPrice < 20
が真の場合、PriceCategory
は 'Low' になります。UnitPrice >= 20 AND UnitPrice < 50
が真の場合、PriceCategory
は 'Medium' になります。- それ以外の場合は、
PriceCategory
は 'High' になります。
SELECT
ProductID,
ProductName,
UnitPrice,
CASE WHEN UnitPrice < 20 THEN 'Low'
END + CASE WHEN UnitPrice >= 20 AND UnitPrice < 50 THEN 'Medium'
END + CASE WHEN UnitPrice >= 50 THEN 'High'
END AS PriceCategory
FROM Products;
この例では、複数のCASE WHEN ステートメントを組み合わせることで、価格カテゴリを文字列の連結によって決定します。
- 各CASE WHEN ステートメントは、特定の条件が真の場合に文字列を返します。
- これらの文字列を連結することで、最終的な価格カテゴリが形成されます。
他の例
SELECT
EmployeeID,
FirstName,
LastName,
CASE WHEN DepartmentID = 1 THEN 'Sales'
WHEN DepartmentID = 2 THEN 'Marketing'
WHEN DepartmentID = 3 THEN 'Engineering'
ELSE 'Other'
END AS DepartmentName
FROM Employees;
この例では、社員の部門IDに基づいて部門名を決定します。
SELECT
OrderID,
OrderDate,
TotalDue,
CASE WHEN TotalDue > 1000 THEN 'Large Order'
WHEN TotalDue >= 500 AND TotalDue <= 1000 THEN 'Medium Order'
ELSE 'Small Order'
END AS OrderSize
FROM Orders;
この例では、注文の合計金額に基づいて注文のサイズを決定します。
デファルト値の指定
CASE WHEN ステートメントの最後にELSE 句を使用することで、すべての条件が偽の場合のデフォルト値を指定できます。
SELECT
ProductID,
ProductName,
UnitPrice,
CASE WHEN UnitPrice < 20 THEN 'Low'
WHEN UnitPrice >= 20 AND UnitPrice < 50 THEN 'Medium'
ELSE 'High'
END AS PriceCategory
FROM Products;
この例では、UnitPrice < 20
と UnitPrice >= 20 AND UnitPrice < 50
の両方の条件が偽の場合、PriceCategory
は 'High' になります。
テーブル値関数 (TVF) の使用
複雑な条件や複数のCASE WHEN ステートメントが必要な場合は、テーブル値関数 (TVF) を使用してロジックをカプセル化することができます。
CREATE FUNCTION dbo.GetPriceCategory(@UnitPrice DECIMAL(18,2))
RETURNS TABLE (PriceCategory VARCHAR(10))
AS
BEGIN
RETURN (
SELECT
CASE WHEN @UnitPrice < 20 THEN 'Low'
WHEN @UnitPrice >= 20 AND @UnitPrice < 50 THEN 'Medium'
ELSE 'High'
END AS PriceCategory
);
END
この例では、GetPriceCategory
という名前のテーブル値関数を定義し、UnitPrice
を受け取って価格カテゴリを返します。
SELECT
ProductID,
ProductName,
UnitPrice,
dbo.GetPriceCategory(UnitPrice).PriceCategory
FROM Products;
このクエリでは、GetPriceCategory
関数を呼び出して価格カテゴリを取得します。
ピボット (PIVOT) 演算子の使用
特定の列に基づいてデータをピボットする必要がある場合は、PIVOT 演算子を使用できます。
SELECT
ProductID,
ProductName,
Low,
Medium,
High
FROM (
SELECT
ProductID,
ProductName,
UnitPrice,
CASE WHEN UnitPrice < 20 THEN 'Low'
WHEN UnitPrice >= 20 AND UnitPrice < 50 THEN 'Medium'
ELSE 'High'
END AS PriceCategory
FROM Products
) AS SourceTable
PIVOT (
MAX(UnitPrice) FOR PriceCategory IN ([Low], [Medium], [High])
) AS PivotTable;
この例では、UnitPrice
を価格カテゴリごとにピボットし、各カテゴリの最大値を計算します。
sql sql-server-2008