SET 子句 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

SET 子句

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

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

SET 子句语法

SET 子句必须出现在您的 SQL 语句中的 SELECT 子句之前。使用以下语法:

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

语法规则:

  • 变量名称的开头为 @

  • 变量名可以包含字母、数字和下划线

  • 变量名最长可为 64 个字符

  • 可以在单个 SET 子句中设置多个变量,用逗号分隔

  • 每个变量只能分配一次(变量是不可变的)

  • 每条 SQL 语句只能使用一次 SET 关键字

使用变量

定义变量后,可以在以下情况下使用它们:

  • 选择子句

  • WHERE 子句

  • 其他 SET 变量赋值

  • 操作替换模板

  • 错误操作替换模板

  • 嵌套的选择查询

  • 函数参数(某些参数,例如 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 操作的关键字段。

非 JSON 负载使用情况

SET 变量不直接支持非 JSON 有效负载,因此必须先对有效负载进行编码或解码:

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

有关如何使用非 JSON 负载的更多信息,请参阅 使用二进制有效载荷

设定条款限制

以下限制适用于 SET 变量:

  • 每条 SQL 语句最多有 10 个唯一变量

  • 最大可变值大小为 128 kiB(缩小后的 UTF-8 JSON 字符串)

  • 所有变量的最大总值大小为 128 KiB

  • 变量名限制为 64 个字符

  • 变量可以直接接受 JSON 负载(必须首先对非 JSON 负载进行编码/解码)