View a markdown version of this page

SET 条款 - AWS IoT Core

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

SET 条款

使用 SET 子句定义存储表达式结果的变量。您可以在 SELECT 和 WHERE 子句以及替代模板中重复使用这些变量。这可以帮助您避免重复复杂的表达式并减少 SQL 语句中函数调用的次数。

SET 子句支持数据类型运算符、函数、、文本、Case 语句、JSON 扩展、变量和嵌套对象查询。

SET 子句语法

在 SQL 语句中,SELECT 子句必须出现在 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 扩展

避免重复的函数调用

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 操作的关键字段。

Non-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 有效负载) encoded/decoded