case
foreach ステートメント内で SAQL case 演算子を使用して、複数の条件の中から選択するロジックを作成します。case 演算子では、検索 case 式と単純な case 式の 2 つの構文形式がサポートされています。
構文 — 検索 case 式
1case
2 when search_condition then result_expr
3 [ when search_condition2 then result_expr2 … ]
4 [ else default_expr ]
5end- case...end
- 式は、case キーワードで始まり、end キーワードで終わります。
- when...then
- when キーワードと then キーワードで条件ステートメントを定義します。case 式には、1 つ以上の条件ステートメントを含めることができます。
-
-
search_condition — true または false に評価される任意の論理式。この式は、SAQL でサポートされている任意の値、識別子、論理演算子、比較演算子、スカラー関数 (日付関数や算術関数を含む) を使用して構成できます。有効な search_condition 構文の例を次に示します。
- xInt < 5
- price > 1000 and price <= 2000
- units*round(price_per_unit) < abs(revenue)
-
result_expr — SAQL エンジンで評価できる任意の式。値、識別子、およびスカラー関数 (日付関数や算術関数を含む) などを含めることができます。式は、任意のデータ型に評価されます。ただし、このデータ型はすべての条件式で一致している必要があります。つまり、result_expr が数値型の場合、result_expr2 … result_exprN も数値型である必要があります。有効な result_expr 構文の例を次に示します。
- xInt
- toString('orderDate', "dd/MM/yyyy")
- "abc"
-
search_condition — true または false に評価される任意の論理式。この式は、SAQL でサポートされている任意の値、識別子、論理演算子、比較演算子、スカラー関数 (日付関数や算術関数を含む) を使用して構成できます。有効な search_condition 構文の例を次に示します。
- else
- (省略可能) — デフォルトの式を指定できます。else ステートメントは、when/then 条件ステートメントの後に配置する必要があります。else ステートメントは 1 つしか使用できません。
-
-
default_expr — SAQL エンジンで評価できる任意の式。値、識別子、およびスカラー関数 (日��関数や算術関数を含む) などを含めることができます。データ型は、前の条件ステートメントで指定した result_expr のデータ型と一致している必要があります。
-
使用方法 — 検索 case 式
条件ステートメントは、指定した順序で 1 行ずつ評価されます。search_condition が true と評価されると、その行の対応する result_expr が返されます。そのため、複数の条件ステートメントで true が返される場合でも、最初の条件ステートメントのみが評価されます。1 つ以上の when/then ステートメントを指定する必要があります。when/then ステートメントは無制限に指定できます。
省略可能な else ステートメントで、default_expr を設定できます。どの search_condition 式も true に評価されない場合、default_expr 式が返されます。else ステートメントが指定されない場合、デフォルトでは null が返されます。
構文 — 単純な case 式
1case primary_expr
2 when test_expr then result_expr
3 [ when test_expr2 then result_expr2 … ]
4 [ else default_expr ]
5end- case...end
- 式は、case キーワードで始まり、end キーワードで終わります。
-
-
primary_expr — SAQL エンジンで評価できる任意のスカラー式。値、識別子、およびスカラー関数 (日付関数や算術関数を含む) などを含めることができます。式は、比較可能な任意のデータ型 (数値、文字列、または日付) に評価されます。有効な primary_expr 構文の例を次に示します。
- xInt % 3
- date('year', 'month', 'day')
- "abc"
-
primary_expr — SAQL エンジンで評価できる任意のスカラー式。値、識別子、およびスカラー関数 (日付関数や算術関数を含む) などを含めることができます。式は、比較可能な任意のデータ型 (数値、文字列、または日付) に評価されます。有効な primary_expr 構文の例を次に示します。
- when...then
- when キーワードと then キーワードで条件ステートメントを定義します。case 式には、1 つ以上の条件ステートメントを含めることができます。
-
-
test_expr — SAQL エンジンで評価できる任意のスカラー式。この式は、任意の値、識別子、およびスカラー関数 (日付関数や算術関数を含む) を使用して構成できますが、primary_expr と同じデータ型に評価される必要があります。有効な test_expr 構文の例を次に示します。
- 5
- "abc"
- abs(profit)
-
result_expr — SAQL エンジンで評価できる任意のスカラー式。値、識別子、およびスカラー関数 (日付関数や算術関数を含む) などを含めることができます。式は、任意のデータ型に評価されます。ただし、このデータ型はすべての条件ステートメントで一致している必要があります。つまり、result_expr が数値型の場合、result_expr2...result_exprN も数値型である必要があります。result_expr 構文の例を次に示します。
- xInt
- toString('orderDate', "dd/MM/yyyy")
- "abc"
-
test_expr — SAQL エンジンで評価できる任意のスカラー式。この式は、任意の値、識別子、およびスカラー関数 (日付関数や算術関数を含む) を使用して構成できますが、primary_expr と同じデータ型に評価される必要があります。有効な test_expr 構文の例を次に示します。
- else
- (省略可能) else キーワードではデフォルトの式を指定できます。else ステートメントは、when/then 条件ステートメントの後に配置する必要があります。else ステートメントは 1 つしか使用できません。
-
- default_expr — SAQL エンジンで評価できる任意のスカラー式。値、識別子、およびスカラー関数 (日付関数や算術関数を含む) などを含めることができます。データ型は、前の条件ステートメントで指定した result_expr のデータ型と一致している必要があります。
使用方法 — 単純な case 式
条件ステートメントは、指定した順序で 1 行ずつ評価されます。指定の条件ステートメントが primary_expr == test_expr の場合、その行の対応する result_expr が返されます。1 つ以上の when/then ステートメントを指定する必要があります。when/then ステートメントは無制限に指定できます。
省略可能な else ステートメントで、default_expr を設定できます。primary_expr がどの test_expr 条件とも等しくない場合、default_expr が返されます。else ステートメントが指定されない場合、デフォルトでは null が返されます。
例
次のクエリ例では、単純な case 式構文が使用されています。
1q = load "data";
2q = foreach q generate xInt, (case xInt % 3
3 when 0 then "3n"
4 when 1 then "3n+1"
5 else "3n+2"
6end) as modThree;例
次のクエリ例では、検索 case 式構文が使用されています。
1q = load "data";
2q = foreach q generate price, (case
3 when price < 1000 then "category1"
4 when price >= 1000 and price < 2000 then "category2"
5 else "category3"
6end) as priceLevel;null 値の処理
通常、null 値は比較できません。search_condition、primary_expr、または test_expr が null に評価された場合、else で指定された default_expr (else 句が指定されていない場合は null) が返されます。たとえば、次のクエリでは Mea1 が null に評価されると "Other" が返されます。
1q = load "data";
2q = foreach q generate Mea1, (case Mea1
3 when 0 then "Type1"
4 when 1 then "Type2"
5 else "Other"
6end) as Category;ただし、is null および is not null 演算子を使用して、null 値の条件を指定することもできます。
1q = load "data";
2q = foreach q generate Mea1, (case
3 when Mea1 is null then "Is Null"
4 else "Is Not Null"
5end) as Category;日付処理のベストプラクティス
case 式で日付値を使用する前に、SAQL toDate() 関数を使用して、文字列または Unix エポック秒の日付値を変換します。この操作を行うことで、比較の一貫性を最大限に確保できます。
例
1q = load "data/dates";
2q = foreach q generate OrderDate, (case
3 when toDate(OrderDate_epoch_secs) < toDate("2/1/2015", "M/d/yyyy") and
4toDate(OrderDate_epoch_secs) >= toDate("1/1/2015", "M/d/yyyy") then "Jan"
5 else "Other"
6end) as Month;