CASE 句

ADQL クエリに条件を追加するには、SELECT 句内の CASE 句を使用します。特定の条件でデータを変換できます。この句は、集約関数とバケット関数をサポートします。

構文

CODE
SELECT CASE WHEN (condition) THEN (action 1) ELSE (action 2) END FROM event_type
CASE 句には複数の条件を指定できます。
CODE
SELECT CASE WHEN (condition 1) THEN (action 1) 
	WHEN (condition 2) THEN (action 2)
	WHEN (condition 3) THEN (action 3)
	ELSE (action 4) END FROM event_type

メトリック関数の使用例

集約には CASE 句のメトリック関数を使用できます。次に計数と平均集約関数を使用した例を示します。

アプリケーションのユーザー体験に基づくトランザクションの計数

次のクエリは、アプリケーションで通常のユーザー体験およびその他のユーザー体験を持つトランザクションの数を表示します。
CODE
SELECT application, CASE WHEN userExperience = "NORMAL" THEN count(userExperience) AS normalTransactionsCount ELSE count(userExperience) AS otherTransactionsCount END FROM transactions
結果は次の列の下に表示されます。
  • アプリケーション
  • normalTransactionsCount
  • otherTransactionsCount

ユーザー体験の値とアプリケーションの合計トランザクション数を表示する

アプリケーションでは、次のクエリは通常のトランザクションおよびその他のトランザクションのユーザー体験値と、合計トランザクション数を表示します。合計数は、アプリケーションごとに 1 回だけ表示されます。
CODE
SELECT application, CASE WHEN userExperience = "NORMAL" THEN userExperience AS userExperienceValues ELSE userExperience AS otherUserExperienceValues END, count(userExperience) AS totalTransactionsCount FROM transactions
注: WHEN 条件が成り立たない場合、そのフィールドの値は null と表示されます。

アプリケーションの通常のトランザクションおよびその他のトランザクションの数の表示

次のクエリはアプリケーションとトランザクション名、通常のトランザクションおよびその他のトランザクションの数を表示します。
CODE
SELECT application, transactionName, CASE WHEN userExperience = "NORMAL" THEN count(userExperience) AS normalTransactionsCount ELSE count(userExperience) AS otherTransactionsCount END FROM transactions
結果は次の列の下に表示されます。
  • アプリケーション
  • トランザクション名
  • normalTransactionsCount
  • otherTransactionsCount

各ユーザー体験値の数の表示

このクエリは、合計トランザクション数とユーザー体験値を、それぞれの数とともに表示します。
CODE
SELECT count(*), userExperience, CASE WHEN userExperience = "NORMAL" THEN count(userExperience) AS normalTransactionsCount ELSE count(userExperience) AS otherTransactionsCount END FROM transactions
各ユーザー体験値の数の表示

応答時間が長いアプリケーションのトランザクション数の表示

このクエリは、応答時間が 10 を超えている通常のトランザクションおよびその他のトランザクションの数を表示します。
CODE
SELECT responseTime, CASE WHEN userExperience = "NORMAL" THEN count(userExperience) AS normalTransactionsCount ELSE count(userExperience) AS otherTransactionsCount END FROM transactions WHERE responseTime > 10
結果は次の列に表示されます。
  • 応答時間
  • normalTransactionsCount
  • otherTransactionsCount

ユーザー体験トランザクションの平均応答時間の計算

このクエリでは、通常、低速、およびその他のユーザー体験トランザクションがあるアプリケーションと、その平均応答時間を示します。
CODE
SELECT application, CASE WHEN userExperience="NORMAL" THEN avg(responseTime) AS normalTransactionsAvgResponseTime WHEN userExperience="SLOW" THEN avg(responseTime) AS slowTransactionsAvgResponseTime ELSE avg(responseTime) AS otherTransactionsAvgResponseTime END FROM transactions
結果は列の下に表示されます。
  • アプリケーション
  • normalTransactionsAvgResponseTime
  • slowTransactionsAvgResponseTime
  • otherTransactionsAvgResponseTime

メトリック関数なしでの使用例

次に、メトリック関数を使用しない例を示します。

応答時間でユーザー体験の値を表示する

次のクエリは、応答時間に関する通常のトランザクションおよびその他のトランザクションのユーザー体験の値を表示します。
CODE
SELECT CASE WHEN userExperience = "NORMAL" THEN userExperience AS userExperienceValues ELSE userExperience AS otherUserExperienceValues END, responseTime FROM transactions
注: WHEN 条件が成り立たない場合、そのフィールドの値は null と表示されます。
結果は列の下に表示されます。
  • userExperienceValues
  • otherUserExperienceValues
  • 応答時間

応答時間が NULL ではないユーザー体験値を表示する

次のクエリは、通常のトランザクションおよびその他のトランザクションで応答時間が null であるユーザー体験値を表示します。
CODE
SELECT CASE WHEN userExperience = "NORMAL" THEN userExperience AS userExperienceValues ELSE userExperience AS otherUserExperienceValues END, responseTime FROM transactions WHERE userExperience IS NOT NULL
注: WHEN 条件が成り立たない場合、そのフィールドの値は null と表示されます。
結果は列の下に表示されます。
  • userExperienceValues
  • otherUserExperienceValues
  • 応答時間

CASE 句の後のステートメント

CASE 句は何らかの条件の下というロジックを適用して特定のメトリックを計算するもので、句の外部で定義された別のメトリックをネストできません。以下に有効な ADQL クエリを示します。結果は指定した順序で表示されます。

バリエーション 1:
CODE
SELECT application, 
	CASE
		WHEN userExperience = "NORMAL" THEN count(userExperience) AS normalTransactionsCount
		ELSE count(userExperience) AS otherTransactionsCount
	END,
	count(*)
FROM transactions
結果は次の順序で表示されます。
  • アプリケーション
  • normalTransactionCount
  • otherTransactionCount
  • count
バリエーション 2:
CODE
SELECT application,
	count(*),
	CASE 
		WHEN userExperience = "NORMAL" THEN count(userExperience) AS normalTransactionsCount
		ELSE count(userExperience) AS otherTransactionsCount
	END
FROM transactions
結果は次の順序で表示されます。
  • アプリケーション
  • count
  • normalTransactionCount
  • otherTransactionCount
上の例では、
  • CASE ブロックは normalTransactionsCountotherTransactionsCount などの、特定のメトリックを計算する条件を定めるロジックに使用されます。
  • count(*) は、アプリケーションごとにグループ化されたすべてのトランザクションの合計数を反映する、別のメトリックです。

制限事項

独自の CASE ステートメントを記述する場合は、次の点を考慮します。
  • フィールドに算術演算を使用しません。
    PYTHON
    SELECT CASE WHEN userExperience = "NORMAL" THEN (responseTime+10) AS normalResponseTimesModified ELSE (responseTime-10) AS otherResponseTimesModified END from transactions
  • countsumaverage などのメトリック式を算術演算に使用しません。
    PYTHON
    SELECT CASE WHEN userExperience = "NORMAL" THEN (count(userExperience)+10) AS normalTxnCountModified ELSE (count(userExperience)-10) AS otherTxnCountModified END from transactions
  • CASE 句の後の非メトリック派生フィールドでは算術演算を使用しません。
    PYTHON
    SELECT CASE WHEN userExperience = "NORMAL" THEN responseTime AS normalResponseTimeValues ELSE responseTime AS otherResponseTimeValues END, normalResponseTimeValues+5, otherResponseTimeValues-10 from transactions