

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

# Choice ワークフローの状態
<a name="state-choice"></a>

**ステートの管理とデータの変換**  
[変数を使用したステート間のデータ受け渡し](workflow-variables.md)と [JSONata を使用したデータ変換](transforming-data.md)について説明します。

`Choice` 状態 (`"Type": "Choice"`) はステートマシンに条件付きロジックを追加します。

[共通状態フィールド](statemachine-structure.md#amazon-states-language-common-fields)の大半に加えて、`Choice` 状態には次の追加フィールドが含まれます。

**`Choices` (必須)**  
ステートマシンが次に移行する状態を決定する[選択ルール](#state-choice-rules)の配列。`Choice` 状態では、少なくとも 1 つのルールを定義する必要があります。  
`Choice` ステートが実行されると、Step Functions はそれぞれの **Choice ルール**を true または false に評価します。この評価結果に基づいて、Step Functions はワークフロー内の次のステートへ遷移します。

**`Default` (オプション、推奨)**  
どの **Choice ルール**も true に評価されなかった場合に遷移する先のステートの名前。

**重要**  
 `Choice` 状態では `End` フィールドはサポートされません。また、`Next` は `Choices` フィールド内でのみ使用されます。  
ワークフローの実行中にどの **Choice** も true に評価されず、**Default** が指定されていない場合、*そのステートからの遷移失敗*により**エラー**がスローされます。

## Choice ルール (JSONata)
<a name="state-choice-rules"></a>

`Choice` ステートでは、JSONata を使用する場合、`Choices` フィールドを指定する必要があります。このフィールドには、次のフィールドを含む、1 つ以上の Choice ルールを指定します。
+ **`Condition` フィールド** – true/false に評価される JSONata 式。
+ **`Next` フィールド** – ステートマシン内のステートの名前と一致する必要のある値。
+ **`Assign` フィールド** (オプション) – この特定の選択ルールが一致すると変数を割り当てます。各選択ルールは独自の`Assign`ブロックを持つことができ、どのパスを取るかに応じて異なる変数を設定できます。状態レベルで `Assign`ブロックを指定することもできます。これは、どの選択ルールが一致するかに関係なく適用されます。

次の例では、数値が `1` と等しいかどうかを確認します。

```
{
  "Condition": "{% $foo = 1 %}",
  "Next": "NumericMatchState"
}
```

次の例は、`type` 変数が `local` に等しいかどうかを確認します。

```
{
  "Condition": "{% $type = 'local' %}",
  "Next": "StringMatchState"
}
```

次の例では、文字列が `MyStringABC` を超過しているかどうかを確認します。

```
{
  "Condition": "{% $foo > 'MyStringABC' %}",
  "Next": "StringGreaterMatchState"
}
```

次の例は、文字列が null でないかどうかを確認します。

```
{
 "Condition" : "{% $possiblyNullValue != null and $possiblyNullValue = 42 %}",
 "Next": "NotNullAnd42"
}
```

次の例は、一致した条件に基づいて異なる変数を設定するルールごとの`Assign`ブロックを持つ`Choice`状態を示しています。

```
{
  "Type": "Choice",
  "Choices": [
    {
      "Condition": "{% $states.input.category = 'premium' %}",
      "Next": "PremiumPath",
      "Assign": {
        "discount": 20
      }
    },
    {
      "Condition": "{% $states.input.category = 'standard' %}",
      "Next": "StandardPath",
      "Assign": {
        "discount": 5
      }
    }
  ],
  "Default": "DefaultPath",
  "Assign": {
    "discount": 0
  }
}
```

## 選択状態で割り当てを使用する
<a name="state-choice-assign"></a>

`Assign` フィールドは、Choice 状態の 2 つのレベルで使用できます。
+ **最上位** – Choice ルールの外部で、Choice 状態で直接定義されます。
+ **選択ルール内** – `Choices`配列内の個々のルール内で定義されます。

これら 2 つの配置は、実行時に相互に排他的です。選択ルールが一致した場合、Step Functions はそのルールの `Assign`フィールドのみを評価し、最上位`Assign`フィールドは評価しません。Step Functions は、選択ルールが一致しず、ワークフローが `Default`状態に移行した`Assign`場合にのみ、最上位レベルを評価します。

次の例は、両方の配置を示しています。

```
{
  "Type": "Choice",
  "Assign": {
    "outputValue": "{% 'default path taken' %}"
  },
  "Choices": [
    {
      "Condition": "{% $score > 90 %}",
      "Assign": {
        "outputValue": "{% 'high score' %}"
      },
      "Next": "HighScoreState"
    },
    {
      "Condition": "{% $score > 50 %}",
      "Next": "MediumScoreState"
    }
  ],
  "Default": "LowScoreState"
}
```

この例では、 `$score`が 90 より大きい場合、Step Functions は `outputValue`を に割り当て`"high score"`、 に移行します`HighScoreState`。最上位レベル`Assign`は評価されません。ルールが一致しない場合、Step Functions は最上位レベルを評価し`Assign`、 に移行します`LowScoreState`。

## Choice ルール (JSONPath)
<a name="state-choice-rules-jsonpath"></a>

`Choice` ステートでは、JSONPath を使用する場合、`Choices` フィールドを指定する必要があります。このフィールドには、次のフィールドを含む、1 つ以上の Choice ルールを指定します。
+ **比較** – 比較する入力変数、比較のタイプ、および可変を比較する値に指定する 2 つのフィールド。選択ルールは、2 つの可変の比較をサポートします。選択ルール内で、可変値は、サポートされている比較演算子の名前に `Path` を加えて、状態入力の別の値と比較できます。比較対象の `Variable` フィールドとパスフィールドの値は、有効な[参照パス](amazon-states-language-paths.md#amazon-states-language-reference-paths)でなければなりません。
+ **`Next` フィールド ** – このフィールドの値はステートマシンの状態名と一致する必要があります。

次の例では、数値が `1` と等しいかどうかを確認します。

```
{
  "Variable": "$.foo",
  "NumericEquals": 1,
  "Next": "FirstMatchState"
}
```

次の例では、文字列が `MyString` と等しいかどうかを確認します。

```
{
  "Variable": "$.foo",
  "StringEquals": "MyString",
  "Next": "FirstMatchState"
}
```

次の例では、文字列が `MyStringABC` を超過しているかどうかを確認します。

```
{
  "Variable": "$.foo",
  "StringGreaterThan": "MyStringABC",
  "Next": "FirstMatchState"
}
```

次の例では、文字列が null かどうかを確認します。

```
{
 "Variable": "$.possiblyNullValue",
 "IsNull": true
}
```

次の例は、`IsPresent` 選択ルール が先行しているため、`$.keyThatMightNotExist` が 存在する場合は、StringEquals ルールのみが評価される方法を示しています。

```
"And": [
 {
 "Variable": "$.keyThatMightNotExist",
 "IsPresent": true
 },
 {
 "Variable": "$.keyThatMightNotExist",
 "StringEquals": "foo"
 }
]
```

次の例では、ワイルドカードを含むパターンが一致するかどうかを確認します。

```
{
 "Variable": "$.foo",
 "StringMatches": "log-*.txt"
}
```

次の例では、タイムスタンプが `2001-01-01T12:00:00Z` と等しいかどうかを確認します。

```
{
  "Variable": "$.foo",
  "TimestampEquals": "2001-01-01T12:00:00Z",
  "Next": "FirstMatchState"
}
```

次の例では、可変を状態の入力の別の値と比較します。

```
{
 "Variable": "$.foo",
 "StringEqualsPath": "$.bar"
}
```

Step Functions は `Choices` フィールドにリストされた順序で各選択ルールを検討します。次に、最初の選択ルールの `Next` フィールドで指定された状態に遷移します。ここで、変数は比較演算子に従って値と一致します。

次の比較演算子がサポートされています。
+ `And`
+ `BooleanEquals`,`BooleanEqualsPath`
+ `IsBoolean`
+ `IsNull`
+ `IsNumeric`
+ `IsPresent`
+ `IsString`
+ `IsTimestamp`
+ `Not`
+ `NumericEquals`,`NumericEqualsPath`
+ `NumericGreaterThan`,`NumericGreaterThanPath`
+ `NumericGreaterThanEquals`,`NumericGreaterThanEqualsPath`
+ `NumericLessThan`,`NumericLessThanPath`
+ `NumericLessThanEquals`,`NumericLessThanEqualsPath`
+ `Or`
+ `StringEquals`,`StringEqualsPath`
+ `StringGreaterThan`,`StringGreaterThanPath`
+ `StringGreaterThanEquals`,`StringGreaterThanEqualsPath`
+ `StringLessThan`,`StringLessThanPath`
+ `StringLessThanEquals`,`StringLessThanEqualsPath`
+ `StringMatches`
+ `TimestampEquals`,`TimestampEqualsPath`
+ `TimestampGreaterThan`,`TimestampGreaterThanPath`
+ `TimestampGreaterThanEquals`,`TimestampGreaterThanEqualsPath`
+ `TimestampLessThan`,`TimestampLessThanPath`
+ `TimestampLessThanEquals`,`TimestampLessThanEqualsPath`

これらの演算子のそれぞれで、対応する値が適切なタイプ (文字列、数値、ブール値、またはタイムスタンプ) である必要があります。Step Functions では、数値フィールドと文字列値の一致を試みません。ただし、タイムスタンプフィールドは論理的に文字列であるため、タイムスタンプとみなされるフィールドを `StringEquals` コンパレータで一致させることはできます。

**注記**  
相互運用性のため、数値比較は [IEEE 754-2008`binary64` データタイプ](https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats)で表される大きさまたは精度を外れる値では機能しないと考えてください。特に、`[-253+1, 253-1]` の範囲外の整数では想定した形での比較が失敗する可能性があります。  
タイムスタンプ (例えば、`2016-08-18T17:33:00Z`) は、[RFC3339 プロファイル ISO 8601](https://www.ietf.org/rfc/rfc3339.txt) に準拠している必要があり、さらに制限があります。  
大文字の `T` で日付部分と時刻部分を区切る必要があります。
大文字の `Z` で数値タイムゾーンオフセットが存在しないことを示す必要があります。
文字列比較の動作を理解するには、[Java `compareTo` のドキュメント](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-)を参照してください。  
`And` および `Or` 演算子は選択ルールの空ではない配列の値であり、それ自体に `Next` フィールドを含まない必要があります。同様に、`Not` 演算子の値は単一の選択ルールである必要があり、`Next` フィールドを含めることはできません。  
`And`、`Not`、および `Or` を使用して、複雑なネスト化された選択ルールを作成できます。ただし、`Next` フィールドは最上位の選択ルールにのみ使用できます。  
1 つ以上のワイルドカード (「\*」) を使用したパターンに対する文字列比較は、StringMatches 比較演算子を使用して実行できます。ワイルドカード文字は、スタンダード `\\ (Ex: “\\*”)` を使用してエスケープされます。「\*」以外の文字は、マッチング中に特別な意味を持ちません。