TDengine 比较函数 NULLIF 用户手册
NULLIF
NULLIF 是一个条件判断函数:当首参与次参相等时返回 NULL,否则返回首参本身,用于屏蔽占位值或避免除零等异常情况。
项目 | 说明 |
---|---|
函数名称 | NULLIF |
功能 | 比较两个表达式;若 expr1 = expr2 则返回 NULL ,否则返回 expr1 。 |
语法 | NULLIF(expr1, expr2) |
参数 | expr1 、expr2 :任意可比较类型,遵循隐式类型转换规则。 |
返回类型 | 与 expr1 一致;当 expr1 = expr2 时结果为 NULL 。 |
适用范围 | 普通表、超级表;支持 SELECT、WHERE、GROUP BY、PARTITION BY、窗口语句;可用于 ORDER BY。 |
产品支持 | TDengine、MySQL、PostgreSQL、SQL Server、Oracle、MariaDB、SQLite 等 ANSI SQL 实现 |
智能电表表结构
CREATE STABLE meters (ts TIMESTAMP,voltage FLOAT,current FLOAT,power FLOAT
) TAGS (groupid INT,location VARCHAR(64)
);
计算规则与返回说明
- 先按照数据库比较规则判断
expr1
与expr2
是否相等。 - 相等 ⇒ 返回
NULL
;否则返回expr1
的原值与类型。 - 支持在窗口或聚合内使用;比较结果为 NULL 的行会被聚合函数自动忽略。
常见使用示例(均基于智能电表场景)
-
避免除零错误:
SELECTts,power / NULLIF(current, 0) AS load_resistance FROM meters WHERE location = 'Plant.A';
当电流为 0 时返回 NULL,防止报错。
-
过滤无效标记:
SELECTts,NULLIF(voltage, -9999) AS voltage_clean FROM meters WHERE groupid = 10;
将异常占位值
-9999
转为 NULL,便于后续统计忽略。 -
结合窗口聚合:
SELECT_wstart,AVG(NULLIF(power, -1)) AS avg_valid_power FROM meters WHERE location = 'Plant.B' INTERVAL(5m);
每 5 分钟时间窗中,仅对真实功率计算平均值。
与 IFNULL 的对比
维度 | NULLIF | IFNULL |
---|---|---|
触发条件 | expr1 = expr2 时返回 NULL | expr1 为 NULL 时返回备用值 |
常见用途 | 把特定值映射为 NULL(如异常标记、除零保护) | 为 NULL 数据提供默认值(如缺测补 0) |
返回类型 | expr1 | 根据 expr1 /expr2 兼容类型推导 |
在智能电表场景 | 屏蔽异常读数、剔除重复标记、避免非法运算 | 填补缺测、构造默认告警级别、保持统计口径 |
相同点 | 都属于空值处理函数;输出可直接参与聚合或过滤 |
实际应用案例
- 告警生成:
NULLIF(status, 0)
将 0 状态视作未知,辅助 IF/CASE 构造精准告警。 - 能耗报表:在汇总功率时忽略异常占位值,保持统计准确。
- 质量监控:与窗口函数配合,捕捉连续异常但避免因无效值干扰趋势。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。