SET 子句 - AWS IoT Core

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

SET 子句

使用 SET 子句來定義存放運算式結果的變數。您可以在 SELECT 和 WHERE 子句以及替代範本中重複使用這些變數。這可協助您避免重複複雜的表達式,並減少 SQL 陳述式中的函數呼叫次數。

SET 子句支援 資料類型運算子函數文字案例陳述式JSON Extensions變數巢狀物件查詢

SET 子句語法

SET 子句必須出現在 SQL 陳述式中的 SELECT 子句前面。使用下列語法:

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

語法規則:

  • 使用 啟動變數名稱 @

  • 變數名稱可以包含字母、數字和底線

  • 變數名稱長度最多可達 64 個字元

  • 您可以在單一 SET 子句中設定多個變數,並以逗號分隔

  • 每個變數只能指派一次 (變數不可變)

  • 每個 SQL 陳述式只能使用一次 SET 關鍵字

使用變數

定義變數之後,您可以在以下位置使用它們:

  • SELECT 子句

  • WHERE 子句

  • 其他 SET 變數指派

  • 動作替換範本

  • 錯誤動作替換範本

  • 巢狀 SELECT 查詢

  • 函數參數 (某些參數,例如 roleArn 參數,以及切換類似transform("enrichArray", attributes, values)不支援變數之函數模式的參數)

變數會使用與 SET @variable_name 子句中使用的相同語法來參考。您也可以使用 JSON 延伸語法來存取包含 物件之變數的屬性,例如 @variable_name.property

SET 子句範例

基本變數用量

下列範例顯示發佈在主題 上的承載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

避免重複的函數呼叫

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 承載的詳細資訊,請參閱 使用二進位承載

SET 子句限制

下列限制適用於 SET 變數:

  • 每個 SQL 陳述式最多 10 個唯一變數

  • 最大變數值大小為 128 KiB (最小 UTF-8 JSON 字串)

  • 所有變數的總值大小上限為 128 KiB

  • 變數名稱限制為 64 個字元

  • 變數可以直接接受 JSON 承載 (必須先編碼/解碼非 JSON 承載)