

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

# SET 句
<a name="iot-sql-set"></a>

SET 句を使用して、式の結果を保存する変数を定義します。これらの変数は、SELECT 句と WHERE 句、および置換テンプレートで再利用できます。これにより、複雑な式が重複するのを防ぎ、SQL ステートメント内の関数呼び出しの数を減らすことができます。

SET 句は、[データ型](iot-sql-data-types.md)、[オペレータ](iot-sql-operators.md)、、[関数](iot-sql-functions.md)[リテラル](iot-sql-literals.md)、[Case ステートメント](iot-sql-case.md)、、[JSON 拡張](iot-sql-json.md)[変数](#iot-sql-set-usage)、および をサポートします[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)。

## SET 句構文
<a name="iot-sql-set-syntax"></a>

SET 句は、SQL ステートメントの SELECT 句の前に表示する必要があります。次の構文を使用します。

```
SET @variable_name = expression [, @variable_name2 = expression2]
```

構文ルール:
+ で変数名を開始する `@`
+ 変数名には、文字、数字、アンダースコアを含めることができます
+ 変数名は最大 64 文字です
+ 複数の変数をカンマで区切って 1 つの SET 句に設定できます。
+ 各変数を割り当てることができるのは 1 回のみです (変数はイミュータブルです)
+ SET キーワードは SQL ステートメントごとに 1 回のみ使用できます

## 変数の使用
<a name="iot-sql-set-usage"></a>

変数を定義したら、次の場所で使用できます。
+ SELECT 句
+ WHERE 句
+ その他の SET 変数の割り当て
+ アクション置換テンプレート
+ エラーアクション置換テンプレート
+ ネストされた SELECT クエリ
+ 関数パラメータ (roleArn パラメータなどの特定のパラメータ、および のような関数のモードを切り替えるパラメータは変数をサポート`transform("enrichArray", attributes, values)`していません)

変数は、SET 句で使用されるのと同じ`@variable_name`構文を使用して参照されます。JSON 拡張構文を使用して、 などのオブジェクトを含む変数のプロパティにアクセスすることもできます`@variable_name.property`。

## SET 句の例
<a name="iot-sql-set-examples"></a>

**基本的な変数の使用法**

次の例は、トピック で公開されたペイロードを示しています`device/data`。 `{"temp_fahrenheit": 75, "humidity": 60}`

SQL ステートメント:

```
SET @temp_celsius = (temp_fahrenheit - 32) * 5 / 9
SELECT @temp_celsius AS celsius, humidity FROM 'device/data'
```

送信ペイロード: `{"celsius": 23.89, "humidity": 60}`

**埋め込み JSON オブジェクトのメンバーにアクセスする **

次の例は、トピック で公開されたペイロードを示しています`device/data`。 `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

SQL ステートメント:

```
SET @device_sensor_data = device1.deviceData.sensors
SELECT @device_sensor_data.temp_fahrenheit AS temp_fahrenheit, @device_sensor_data.humidity as humidity, device1.deviceId as deviceId FROM 'device/data'
```

送信ペイロード: `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 JSON 拡張機能の操作方法の詳細については、「」を参照してください。 [JSON 拡張](iot-sql-json.md)

**重複する関数呼び出しの回避**

SET 変数は、複雑なデコードオペレーションの重複を回避するのに役立ちます。

```
SET @decoded_data = decode(encode(*, 'base64'), 'proto', 'schema', 'schema.desc', 'message.proto', 'Message')
SELECT @decoded_data.sensor_id, @decoded_data.reading FROM 'device/protobuf' 
WHERE @decoded_data.reading > 100
```

SET 変数がない場合、関数呼び出し制限を超えるデコード関数を 3 回繰り返す必要があります。

**複数の変数**

複数の変数をカンマで区切ることで、1 つの SET 句で定義できます。

```
SET @user_data = get_user_properties(device_id), @threshold = 50
SELECT @user_data.name, temp_fahrenheit FROM 'sensors/+'
WHERE temp_fahrenheit > @threshold AND @user_data.active = true
```

**置換テンプレートでの変数の使用**

変数はアクション置換テンプレートでも使用できます。これにより、SQL ステートメントとルールアクションの両方で計算された値を再利用できます。

SQL ステートメント:

```
SET @temp_celsius = (temp_fahrenheit - 32) * 5 / 9
SELECT @temp_celsius AS celsius, humidity FROM 'device/data'
```

アクション設定:

```
{
  "s3": {
    "roleArn": "arn:aws:iam::123456789012:role/testRuleRole",
    "bucketName": "bucket",
    "key": "temperature-data/${device_id}/temp-${@temp_celsius}C.json"
  }
}
```

この例では、SET 変数`@temp_celsius`が置換テンプレートで使用され、S3 アクションのキーフィールドが作成されます。

**JSON 以外のペイロードの使用**

SET 変数は JSON 以外のペイロードを直接サポートしないため、ペイロードは最初にエンコードまたはデコードする必要があります。

```
SET @encoded_payload = encode(*, 'base64')
SELECT @encoded_payload AS raw_data FROM 'device/binary'
```

 JSON 以外のペイロードの操作方法の詳細については、「」を参照してください。 [バイナリペイロードの使用](binary-payloads.md)

## SET 句の制限
<a name="iot-sql-set-limits"></a>

SET 変数には、次の制限が適用されます。
+ SQL ステートメントあたり最大 10 個の一意の変数
+ 最大変数値サイズは 128 KiB (UTF-8 JSON 文字列の最小化)
+ すべての変数の最大合計値サイズは 128 KiB です
+ 変数名は 64 文字に制限されています
+ 変数は JSON ペイロードをそのまま直接受け入れることができます (JSON 以外のペイロードは最初にエンコード/デコードする必要があります)