

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Ifelse
<a name="ifelse-function"></a>

`ifelse` では、一連の *if*, *then* 式のペアを評価し、最初の *if* 引数が true に評価される *then* 引数の値を返します。true に評価される *if* 引数がない場合、*else* 引数の値が返されます。

## 構文
<a name="ifelse-function-syntax"></a>

```
ifelse(if-expression-1, then-expression-1 [, if-expression-n, then-expression-n ...], else-expression)
```

## 引数
<a name="ifelse-function-arguments"></a>

`ifelse` は、1 つ以上の *if*、*then* 式のペアと、1 つの正確な *else* 引数の式を必要とします。

 *if 式*   
式は true かどうかが評価されます。**address1** のようなフィールド名、**'Unknown'** のようなリテラル値、または `toString(salesAmount)` のような別の関数を使用できます。例: 「`isNotNull(FieldName)`」。  
`if` 引数で複数の AND と OR 演算子を使用する場合は、ステートメントを括弧で囲んで処理の順序を指定します。たとえば、次の `if` 引数は、月が 1、2、または 5 で、年が 2000 のレコードを返します。  

```
ifelse((month = 5 OR month < 3) AND year = 2000, 'yes', 'no')
```
次の `if` 引数では、同じ演算子を使用していますが、月が 5 で任意の年、または月が 1 または 2 で年が 2000 のレコードを返します。  

```
ifelse(month = 5 OR (month < 3 AND year = 2000), 'yes', 'no')
```

 *then 式*   
*if* 引数が true と評価される場合に返される式。**address1** のようなフィールド名、**'Unknown'** のようなリテラル値、または別の関数の呼び出しを使用できます。式は、他の `then` 引数および `else` と同じデータ型を使用する必要があります。

 *else 式*   
true と評価される *if* 引数がない場合に返される式。**address1** のようなフィールド名、**'Unknown'** のようなリテラル値、または `toString(salesAmount)` のような別の関数を使用できます。式は、すべての `then` 引数と同じデータ型を使用する必要があります。

## 戻り型
<a name="ifelse-function-return-type"></a>

`ifelse` は、同じデータ型の値を *then 式*で返します。すべてのデータを返す *then* および *else* 式は、同じデータ型であるか、同じデータ型に変換されている必要があります。

## 例
<a name="ifelse-function-example"></a>

次の例では、フィールド `country` のエイリアスの列を生成します。

```
ifelse(country = "United States", "US", country = "China", "CN", country = "India", "IN", "Others") 
```

このようなユースケースでは、フィールド内の各値をリテラルのリストに対して評価し、最初に一致した値に対応する結果を返します。作業を簡単にするために、関数の切り替えをお勧めします。前の例は、[https://docs.aws.amazon.com/quicksight/latest/user/switch-function.html](https://docs.aws.amazon.com/quicksight/latest/user/switch-function.html) を使用して次の文に書き換えることができます。

```
switch(country,"United States","US","China","CN","India","IN","Others")
```

次の例では、顧客ごとの売上を人が読み取り可能なレベルに分類します。

```
ifelse(salesPerCustomer < 1000, “VERY_LOW”, salesPerCustomer < 10000, “LOW”, salesPerCustomer < 100000, “MEDIUM”, “HIGH”)
```

次の例では、AND、OR、および NOT を使用して、条件演算子を使用した複数の式を比較し、ワシントンまたはオレゴンではなく、特殊プロモーションを適用されており、注文数が 10 を超える上位の顧客にタグ付けします。値が返されない場合、値 `'n/a'` が使用されます。

```
ifelse(( (NOT (State = 'WA' OR State =  'OR')) AND Orders > 10),  'Special Promotion XYZ',  'n/a')
```

次の例では、OR のみを使用して、それぞれの `country` に対応する大陸の名前を含む新しい列を生成します。

```
ifelse(country = "United States" OR country = "Canada", "North America", country = "China" OR country = "India" OR country = "Japan", "Asia", "Others")
```

前の例は、次の例のように簡略化できます。次の例では、`ifelse` と [https://docs.aws.amazon.com/quicksight/latest/user/in-function.html](https://docs.aws.amazon.com/quicksight/latest/user/in-function.html) を使用して、テストされた値がリテラルリストにある任意の行について、新しい列に値を作成します。`ifelse` を [https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html](https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html) と一緒に使うこともできます。

```
ifelse(in(country,["United States", "Canada"]), "North America", in(country,["China","Japan","India"]),"Asia","Others")
```

作成者はリテラルリストを複数値パラメータに保存し、それを [https://docs.aws.amazon.com/quicksight/latest/user/in-function.html](https://docs.aws.amazon.com/quicksight/latest/user/in-function.html) または [https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html](https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html) 関数で使用できます。次の例は、リテラルリストが 2 つの複数値パラメータに格納されている点を除いて、前の例と同じです。

```
ifelse(in(country,${NorthAmericaCountryParam}), "North America", in(country,${AsiaCountryParam}),"Asia", "Others") 
```

次の例では、グループを売上合計に基づいて売上レコードに割り当てます。各 `if-then` フレーズの構造は、*between* の動作を模倣しています。これは現在、計算フィールドの式では機能しないキーワードです。例えば、比較 `salesTotal >= 0 AND salesTotal < 500` の結果は、SQL での比較 `salesTotal between 0 and 499` と同じ値を返します。

```
ifelse(salesTotal >= 0 AND salesTotal < 500, 'Group 1', salesTotal >= 500 AND salesTotal < 1000, 'Group 2', 'Group 3')
```

次の例では、`coalesce` を使用して最初の非 NULL の値を返すことで NULL 値をテストします。日付フィールドの NULL の意味を覚えておく必要はなく、代わりに読みやすい説明を使用できます。切断日が NULL の場合、両方が NULL でない限り、この例では中断日を返します。その後、`coalesce(DiscoDate, SuspendDate, '12/31/2491')` `'12/31/2491'` を返します。戻り値は、他のデータ型と一致する必要があります。この日付は一般的ではない値に見えるかもしれませんが、25 世紀の日付は、データマートで日付の最大値として定義された「時間の終わり」を合理的にシミュレートしています。

```
ifelse (  (coalesce(DiscoDate, SuspendDate, '12/31/2491') = '12/31/2491'),  'Active subscriber', 'Inactive subscriber')
```

以下は、すべてのコードを 1 つの長い行に圧縮する必要がないことを示すために、より読みやすい形式のより複雑な例を示しています。この例では、調査結果の値の複数比較を行います。このフィールドの潜在的な NULL 値を処理し、2 つの許容範囲を分類します。また、より多くのテストを必要とする 1 つの範囲と、有効ではない別の範囲 (範囲外) にラベルを付けます。残りのすべての値について、`else` 条件を適用し、その行の日付から 3 年後に再テストが必要であるというラベル付けをします。

```
ifelse
( 
    isNull({SurveyResult}), 'Untested',  
    {SurveyResult}=1, 'Range 1', 
    {SurveyResult}=2, 'Range 2', 
    {SurveyResult}=3, 'Need more testing',
    {SurveyResult}=99, 'Out of Range',
    concat  
    (
        'Retest by ', 
        toString    
        (
           addDateTime(3, "YYYY", {Date}) 
        )
    )
)
```

次の例では、「手動」で作成されたリージョン名をステートのグループに割り当てます。ここでは、コードの保守を容易にするために、`/* */` で囲みながらスペースとコメントを記述しています。

```
ifelse 
(    /* NE REGION*/
     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
    'Northeast',

     /* SE REGION*/
     locate('Georgia, Alabama, South Carolina, Louisiana',{State}) > 0,
    'Southeast',

    'Other Region'
)
```

リージョンのタグ付けのロジックは、次のように分類されます。

1. 次のように、各リージョンに必要な状態をリスト化し、各リストを引用符で囲み、文字列にします。
   + `'New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire'`
   + `'Georgia, Alabama, South Carolina, Louisiana'`
   + 必要に応じて、さらにセットを追加したり、国、都市、地方、または What3Words を使用したりできます。

1. 次のように、州がリストにある場合、`locate` 関数を使用してゼロ以外の値を返すことにより、(各行の) `State` の値がリストにあるかどうかを確認します。

   ```
   locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) 
   
   and
   
   locate('Georgia, Alabama, South Carolina, Louisiana',{State})
   ```

1. `locate` 関数は `TRUE` または `FALSE` の代わりに数値を返しますが、`ifelse` は `TRUE`/`FALSE` のブール値を必要とします。これを回避するために、`locate` の結果を数値と比較することができます。州がリストにある場合、戻り値はゼロより大きくなります。

   1. 州が存在するかどうかを尋ねます。

      ```
      locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0
      ```

   1. リージョンが存在する場合は、特定のリージョン (この場合は Northeast リージョン) としてラベルを付けます。

      ```
      /*The if expression:*/     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
      /*The then expression:*/   'Northeast',
      ```

1. リストに含まれていない州があり、`ifelse` は単一の `else` 式を必要とするため、残りの州のラベルとして `'Other Region'` を提供します。

   ```
   /*The if expression:*/     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
   /*The then expression:*/   'Northeast',
   /*The else expression:*/   'Other Region'
   ```

1. それらをすべて `ifelse( )` 関数でラップして、最終バージョンを取得します。次の例では、元の [Southeast] リージョンの州を除外します。*`<insert more regions here>`* タグの代わりに、それらを追加し直すことができます。

   リージョンを追加する場合は、さらにこれらの 2 つの行のコピーを作成し、目的に合わせて州のリストを変更することができます。リージョン名は好きなものに、フィールド名は `State` から任意のものに変更できます。

   ```
   ifelse 
   (
   /*The if expression:*/     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
   /*The then expression:*/   'Northeast',
   
   /*<insert more regions here>*/
   
   /*The else expression:*/   'Other Region'
   )
   ```
**注記**  
if 式の初期比較を行う方法は他にもあります。たとえば、「このリストから欠落していない州は何ですか？」という質問があるとします。「どの州がリストに載っていますか？」ではありません。もしそうなら、別の言い方をするでしょう。次のように、locate ステートメントをゼロと比較してリストから欠落している値を見つけ、NOT 演算子を使用してそれらを「欠落していない」として分類することができます。  

   ```
   /*The if expression:*/      NOT (locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) = 0),
   ```
どちらのバージョンも正しいです。選択したバージョンは、ユーザーとそのチームにとって最も意味があり、簡単に維持できるものである必要があります。すべてのオプションが同等である場合は、最も単純なものを選択してください。