

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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)、[案例陳述式](iot-sql-case.md)、[JSON Extensions](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 個字元
+ 您可以在單一 SET 子句中設定多個變數，並以逗號分隔
+ 每個變數只能指派一次 （變數不可變）
+ 每個 SQL 陳述式只能使用一次 SET 關鍵字

## 使用變數
<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 Extensions](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 變數，您需要重複三次解碼函數，這超過函數呼叫限制。

**多個變數**

您可以在單一 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 承載）