
IFNULL
1. 函数概述
项目 | 说明 |
---|
函数名称 | IFNULL |
功能 | 判定首参是否为 NULL;若非 NULL 则返回首参,否则返回第二参数。 |
语法 | IFNULL(expr1, expr2) |
返回类型 | 由 expr1 与 expr2 的可兼容类型推导(保持原类型精度)。 |
适用范围 | 表与超级表,支持 SELECT、WHERE、GROUP BY、PARTITION BY、窗口语句; |
支持版本 | TDengine TSDB v3.3.8.0 及以上 |
2. 参数说明
参数 | 描述 |
---|
expr1 | 任意列、常量或表达式;若该参数不为 NULL,则直接作为函数结果返回。 |
expr2 | 当 expr1 为 NULL 时的替代值;需与 expr1 具备类型兼容性。 |
3. 行为细则
expr1
非 NULL 时忽略 expr2
,直接返回 expr1
。expr1
为 NULL 时返回 expr2
;若 expr2
亦为 NULL,则结果为 NULL。- 支持多种数值、字符串、时间戳及布尔类型组合;若类型不可兼容将报错。
- 函数内部捕获除零等异常表达式并按 NULL 处理,例如
IFNULL(1/0, 10)
返回 10。
4. 智能电表表结构参考
CREATE STABLE meters (ts TIMESTAMP,voltage FLOAT,current FLOAT,power FLOAT
) TAGS (groupid INT,location VARCHAR(64)
);
5. 计算过程与返回值说明
- TDengine 先计算
expr1
,若得到非 NULL 值则直接输出;否则再计算 expr2
并返回其结果。 - 返回列类型取两参数的公共类型(例如 INT 与 DOUBLE 推导为 DOUBLE;TIMESTAMP 保留时间戳类型)。
- 在 GROUP BY / 窗口语句中按分组或窗口粒度逐行评估 IFNULL,结果只影响当前行。
6. SQL 示例与意义
SELECTts,IFNULL(current, 0) AS current_filled
FROM meters
WHERE location = 'East.Park';
SELECT *
FROM meters
WHERE IFNULL(power, 0) > 5000;
SELECTgroupid,SUM(IFNULL(voltage, 0)) AS total_voltage
FROM meters
PARTITION BY tbname;
SELECTIFNULL(location, 'UNKNOWN') AS loc,SUM(power) AS segment_power
FROM meters
STATE_WINDOW(IFNULL(location, 'UNKNOWN'));
7. 常见场景
- 数据清洗:将 NULL 电压、电流即时替换为 0 或标记字符串,方便实时看板。
- 告警逻辑:在阈值判断之前用 IFNULL 消除缺测带来的误报。
- 报表汇总:避免 SUM/AVG 因 NULL 拉低结果,保障能耗统计准确。
- 窗口聚合:在 STATE/SESSION/INTERVAL 窗口中统一标签值,确保分组一致。
- 多类型兜底:把 JSON/VARBINARY 之外的列转换为兼容类型后再替换默认值。
8. 常见错误与排查
问题 | 处理建议 |
---|
在 ORDER BY 中使用 IFNULL 导致语法错误 | 改为子查询预先生成替用列,外层按该列排序。 |
expr1 与 expr2 类型不兼容(如 GEOMETRY 与 INT) | 确保两参类型统一,必要时显式 CAST。 |
expr2 复杂表达式异常(如再触发除零) | 预先判断异常或改用 CASE,避免返回再次变为 NULL。 |
聚合上下文中混用列与聚合表达式导致分组错误 | 将非聚合列加入 GROUP BY 或分层查询。 |
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。