如何在Apache IoTDB通配符查询中区分两类NULL值
区分Apache IoTDB中「时序不存在的NULL」和「主动插入的NULL」
在IoTDB 2.0.6中,确实没有原生语法能直接在SELECT结果里区分这两种NULL,但可以通过以下几种方式实现区分:
方法1:查询时新增时序存在性标识列
利用EXISTS函数判断目标设备的对应时序是否存在,新增一列标识结果,以此区分NULL的来源:
SELECT time, device, temp, pressure, EXISTS(SELECT * FROM `root.site.${device}`.pressure) AS pressure_exists FROM `root.site`.* WHERE time = 1 ALIGN BY DEVICE;
查询结果解读:
- 若
pressure_exists为false:说明该设备的pressure时序从未创建,对应pressure列的NULL是时序缺失导致的 - 若
pressure_exists为true且pressure列是NULL:说明时序存在,但该时刻主动插入了NULL值
方法2:元数据查询与数据查询结合
先通过元数据查询筛选出存在目标时序的设备,再对两类设备分别处理:
- 获取所有拥有
pressure时序的设备:
SELECT DISTINCT device FROM SHOW TIMESERIES `root.site`.**.pressure;
- 分场景查询:
- 对存在
pressure时序的设备,直接查询原始数据(NULL即为主动插入的) - 对不存在
pressure时序的设备,可在客户端层将对应字段标记为「时序缺失」(比如用特定字符串替代NULL)
方法3:提前通过标签/属性标记设备能力
如果是提前规划的设备,可以在创建时序时给设备或时序添加标签,标记是否具备对应传感器:
-- 创建时序时添加标签 CREATE TIMESERIES `root.site.device1.pressure` WITH DATATYPE=FLOAT, TAGS(has_pressure="true"); CREATE TIMESERIES `root.site.device2.temp` WITH DATATYPE=FLOAT, TAGS(has_pressure="false");
查询时带上标签字段:
SELECT time, device, temp, pressure, GET_TAG(device, 'has_pressure') AS has_pressure_sensor FROM `root.site`.* WHERE time = 1 ALIGN BY DEVICE;
通过has_pressure_sensor的值就能直接区分NULL的业务含义。
内容的提问来源于stack exchange,提问作者ごまめとにまめ
相关产品推荐
相关产品推荐

