【发布时间】:2018-03-27 11:04:07
【问题描述】:
我已经苦苦挣扎了两天......但一直碰到 Azure 流分析不支持变量的砖墙。
我想获取一个有效载荷值,提取一个特定的字节,然后输出它......
这很简单:
SELECT
device AS Device,
dateadd(S, time, '1970-01-01') AS Time,
data AS Payload,
SUBSTRING (data, 3, 1) AS Counter,
SUBSTRING (data, 6, 1) AS Sensor1Type,
SUBSTRING (data, 8, 1) AS Sensor1State =
...等
这会在输出 blob 中返回有效负载值、计数器等,如下所示
{"device":"F8A96","time":"2018-03-27T09:04:35.0000000Z","payload":"01b00200000002000000","counter":"b","sensor1type":"2","sensor1state":"0","sensor2type":"2","sensor2state":"0"}
我现在想将“sensor1state”变成“Open”或“Closed”,而不是 1 或 0。
我尝试过使用 CASE、WITH 等,但无法正确处理,因为我正在使用表达式 (SUBSTRING) 的输出而不是列。
例如我试过了:
SELECT
....
SUBSTRING (data, 8, 1) AS Sensor1State =
CASE
WHEN SUBSTRING (data, 8, 1) = 1 THEN 'Closed' ELSE 'Open'
END,
...
但它给了我一个语法错误。
有什么想法吗?流分析不支持变量,所以我不能使用它。我是一个大菜鸟,所以不知道如何表演技巧。
更新:
在破解了一段时间后,解决了我自己的问题,工作查询:
SELECT
device AS Device,
dateadd(S, time, '1970-01-01') AS Time,
data AS Payload,
SUBSTRING (data, 3, 1) AS Counter,
SUBSTRING (data, 6, 1) AS Sensor1Type,
SUBSTRING (data, 14, 1) AS Sensor2Type,
CASE SUBSTRING (data, 8, 1)
WHEN '1' THEN 'Closed'
ELSE 'Open'
END as Sensor1State,
CASE SUBSTRING (data, 16, 1)
WHEN '1' THEN 'Closed'
ELSE 'Open'
END as Sensor2State
INTO
iotoutput
FROM
iotinputs
WHERE
Device = 'F8A96'
注意:我没有在任何地方看到它的文档,但是 StreamAnalytics 代码解析器中似乎存在一个错误,如果您的“INTO”语句不是直接在您的 SELECT 之后,在 FROM 之前,它会给出一个非常无用的语法错误.
【问题讨论】:
-
能否贴出完整的usql脚本和语法错误详情?
-
哇哦,在添加代码和解释错误时,我发现我做错了什么。
-
SQL 粘贴到原帖底部
标签: azure azure-stream-analytics