CASE WHEN文は、BigQueryで複雑な条件分岐を行うための基本的な構文です。基本的な構文はCASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE result ENDとなります。
複数条件を指定する際は、ANDやORを組み合わせて使用します。例えば、CASE WHEN price > 100 AND quantity < 5 THEN 'High Price, Low Quantity' WHEN price < 50 OR quantity > 10 THEN 'Low Price, High Quantity' ELSE 'Normal' ENDのように記述することで、価格と数量の組み合わせによって異なる結果を返すことができます。
条件を組み合わせることで、より詳細なデータ分析が可能になります。
CASE WHEN文での範囲指定
CASE WHEN文では、BETWEENを使って範囲指定を行うことができます。例えば、年齢層を分類する場合、CASE WHEN age BETWEEN 20 AND 29 THEN '20s' WHEN age BETWEEN 30 AND 39 THEN '30s' ELSE 'Other' ENDのように記述します。
日付範囲での条件分岐も同様に行えます。例えば、CASE WHEN order_date BETWEEN '2023-01-01' AND '2023-03-31' THEN 'Q1' WHEN order_date BETWEEN '2023-04-01' AND '2023-06-30' THEN 'Q2' ELSE 'Other' ENDのように記述することで、注文日によって四半期を分類できます。
範囲指定を活用することで、データ分析の幅が広がります。
ネストされたCASE WHEN文
CASE WHEN文はネストして使用することで、さらに複雑な条件分岐を表現できます。例えば、CASE WHEN condition1 THEN CASE WHEN condition2 THEN result1 ELSE result2 END ELSE result3 ENDのように記述します。
IN演算子は、WHERE句で特定の列が指定された複数の値のいずれかに一致するかどうかを判断するために使用されます。構文は 列名 IN (値1, 値2, ..., 値N) です。
例えば、SELECT * FROM users WHERE country IN ('Japan', 'USA', 'UK')というクエリは、usersテーブルから国が日本、アメリカ、イギリスのいずれかのユーザーを抽出します。リストに含める値は、文字列、数値、日付など、列のデータ型と一致している必要があります。
また、NOT IN を使用することで、指定した値以外を選択することも可能です。
IN演算子を使った複数条件の簡略化
IN演算子を使用すると、複数のOR条件を簡潔に記述できます。例えば、WHERE country = 'Japan' OR country = 'USA' OR country = 'UK'という条件は、WHERE country IN ('Japan', 'USA', 'UK')と書き換えることができます。
これにより、クエリが読みやすくなり、記述ミスも減らせます。
さらに、サブクエリと組み合わせて、動的にINリストを生成することも可能です。例えば、SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM new_customers)というクエリは、new_customersテーブルに存在する顧客の注文をordersテーブルから抽出します。
WITH customer_segment AS (
SELECT
customer_id,
CASE
WHEN total_spending > 10000 THEN 'High Value'
WHEN total_spending >= 5000 AND total_spending <= 10000 THEN 'Medium Value'
ELSE 'Low Value'
END AS spending_level
FROM
customers
)
SELECT
*
FROM
customer_segment;
WITH sales_analytics AS (
SELECT
product_id,
date,
sales_amount,
region,
CASE
WHEN region IN ('North', 'East') THEN 'East Region'
WHEN region IN ('South', 'West') THEN 'West Region'
ELSE NULL
END AS region_segment
FROM
sales_data
)
SELECT
*
FROM
sales_analytics;