TDengine 字符串函数 CONCAT 用户手册

CONCAT 函数
语法
CONCAT(expr1, expr2 [, expr3] ...)
功能说明
字符串连接函数,将多个字符串参数按顺序连接成一个字符串。
版本
v3.0.0.0
返回结果类型
如果所有参数均为 VARCHAR 类型,则结果类型为 VARCHAR。如果参数包含 NCHAR 类型,则结果类型为 NCHAR。如果参数包含 NULL 值,则输出值为 NULL。
适用数据类型
VARCHAR、NCHAR
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 该函数最小参数个数为 2 个,最大参数个数为 8 个。
- 如果任一参数为 NULL,则返回 NULL。
- 如果参数包含 NCHAR 类型,所有参数会被转换为 NCHAR 类型后再连接。
- 返回的字符串长度为所有参数长度之和。
- 只能与普通列、TAG 列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
示例所用表与数据(可直接复制执行)
-- 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;-- 智能电表表结构
CREATE STABLE meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT,power DOUBLE,device_id VARCHAR(64),region VARCHAR(32),status_msg VARCHAR(128)
) TAGS (groupid INT,location VARCHAR(64)
);-- 子表
CREATE TABLE d1001 USING meters TAGS (1, 'California.SanFrancisco');
CREATE TABLE d1002 USING meters TAGS (2, 'California.LosAngeles');-- 写入数据
INSERT INTO d1001 VALUES('2024-01-01 00:00:00.000', 10.3, 220, 30.0, 2266.0, 'SF', 'West', 'Normal'),('2024-01-01 00:15:00.000', 12.6, 221, 32.0, 2784.6, 'SF', 'West', 'Warning'),('2024-01-01 00:30:00.000', 11.5, 222, 31.0, 2553.0, 'SF', 'West', 'Error');INSERT INTO d1002 VALUES('2024-01-01 00:00:00.000', 9.0, 219, 28.0, 1971.0, 'LA', 'South', 'Normal'),('2024-01-01 00:15:00.000', 14.5, 218, 40.0, 3161.0, 'LA', 'South', 'Alert'),('2024-01-01 00:30:00.000', 8.2, 220, 25.0, 1804.0, 'LA', 'South', 'OK');
基础示例
示例 1: 两个字符串连接
-- 连接两个常量字符串
taos> SELECT CONCAT('Hello', 'World');concat('Hello', 'World') |
===========================HelloWorld |-- 连接带空格的字符串
taos> SELECT CONCAT('Hello ', 'World');concat('Hello ', 'World') |
============================Hello World |
示例 2: 多个字符串连接
-- 连接三个字符串
taos> SELECT CONCAT('TD', 'engine', '3.0');concat('TD', 'engine', '3.0') |
================================TDengine3.0 |-- 连接多个带分隔符的字符串
taos> SELECT CONCAT('2024', '-', '01', '-', '01');concat('2024', '-', '01', '-', '01') |
=======================================2024-01-01 |
示例 3: NULL 值处理
-- 包含 NULL 值
taos> SELECT CONCAT('Hello', NULL, 'World');concat('Hello', null, 'World') |
=================================NULL |-- 所有参数为 NULL
taos> SELECT CONCAT(NULL, NULL);concat(null, null) |
=====================NULL |
示例 4: 列数据连接
-- 连接两个列
SELECT ts,device_id,region,CONCAT(device_id, '-', region) AS device_region
FROM d1001
ORDER BY ts;
ts | device_id | region | device_region |
======================================================================2024-01-01 00:00:00.000 | SF | West | SF-West |2024-01-01 00:15:00.000 | SF | West | SF-West |2024-01-01 00:30:00.000 | SF | West | SF-West |
示例 5: 数值类型转换连接
-- 使用 CAST 转换数值类型后连接
SELECT ts,voltage,CONCAT('Voltage: ', CAST(voltage AS VARCHAR), 'V') AS voltage_label
FROM d1001
ORDER BY ts
LIMIT 3;
ts | voltage | voltage_label |
=========================================================2024-01-01 00:00:00.000 | 220 | Voltage: 220V |2024-01-01 00:15:00.000 | 221 | Voltage: 221V |2024-01-01 00:30:00.000 | 222 | Voltage: 222V |
智能电表场景示例
示例 6: 生成设备完整标识
目的:组合设备 ID 和位置信息生成唯一的设备完整标识。
-- 生成设备完整标识
SELECT device_id,location,CONCAT(device_id, '@', location) AS full_device_id
FROM meters
GROUP BY device_id, location
ORDER BY device_id;
应用价值:
- 生成全局唯一标识
- 便于设备追踪
- 简化设备管理
示例 7: 格式化状态消息
目的:将状态信息格式化为易读的消息。
-- 格式化状态消息
SELECT ts,device_id,status_msg,CONCAT('[', device_id, '] ', status_msg) AS formatted_status
FROM meters
WHERE ts >= '2024-01-01 00:00:00'
ORDER BY ts
LIMIT 5;
应用价值:
- 提高日志可读性
- 统一消息格式
- 便于问题定位
示例 8: 生成数据导出标签
目的:为导出数据生成包含多个信息的标签。
-- 生成数据导出标签
SELECT ts,CONCAT(device_id, '_', region, '_', CAST(CAST(ts AS BIGINT) AS VARCHAR)) AS export_label,voltage,current
FROM meters
WHERE ts >= '2024-01-01 00:00:00'
ORDER BY ts
LIMIT 5;
应用价值:
- 数据可追溯性
- 导出文件命名
- 批量数据处理
示例 9: 构建告警消息
目的:动态构建包含设备信息和状态的告警消息。
-- 构建告警消息
SELECT ts,device_id,voltage,CONCAT('Device ', device_id, ' voltage ', CAST(voltage AS VARCHAR), 'V at ', region) AS alert_message
FROM meters
WHERE voltage < 220 OR voltage > 222
ORDER BY ts;
应用价值:
- 自动告警生成
- 消息内容丰富
- 提高响应效率
示例 10: 生成文件路径
目的:根据设备信息生成数据文件存储路径。
-- 生成文件路径
SELECT device_id,location,CONCAT('/data/', location, '/', device_id, '/metrics.log') AS file_path
FROM meters
GROUP BY device_id, location;
应用价值:
- 自动化文件管理
- 规范化存储结构
- 便于数据归档
示例 11: 创建显示标签
目的:为数据可视化创建友好的显示标签。
-- 创建可视化标签
SELECT location,CONCAT(region, ' Region - ', location) AS display_label,AVG(power) AS avg_power
FROM meters
WHERE ts >= '2024-01-01 00:00:00'AND ts < '2024-01-01 01:00:00'
GROUP BY location, region
ORDER BY avg_power DESC;
应用价值:
- 提升可视化效果
- 改善用户体验
- 信息更清晰
示例 12: 生成查询键
目的:组合多个字段创建复合查询键。
-- 生成复合查询键
SELECT CONCAT(device_id, ':', region, ':', status_msg) AS query_key,COUNT(*) AS record_count
FROM meters
WHERE ts >= '2024-01-01 00:00:00'
GROUP BY device_id, region, status_msg
ORDER BY record_count DESC;
应用价值:
- 多维度数据分组
- 快速数据检索
- 统计分析便利
生产场景应用
场景 A: 设备监控报表系统
目的:生成包含完整设备信息的监控报表。
应用示例:
-- 生成设备监控报表
SELECT CONCAT('[', device_id, '] ', location) AS device_label,CONCAT('Current: ', CAST(AVG(current) AS VARCHAR), 'A') AS avg_current_label,CONCAT('Voltage: ', CAST(AVG(voltage) AS VARCHAR), 'V') AS avg_voltage_label,CONCAT('Power: ', CAST(AVG(power) AS VARCHAR), 'W') AS avg_power_label
FROM meters
WHERE ts >= NOW - 1h
GROUP BY device_id, location
ORDER BY device_id;
场景 B: 日志记录系统
目的:生成结构化的日志记录。
应用示例:
-- 生成结构化日志
SELECT ts,CONCAT('[', CAST(ts AS VARCHAR), '] [', device_id, '] [', status_msg, '] Voltage=', CAST(voltage AS VARCHAR), 'V Current=', CAST(current AS VARCHAR), 'A') AS log_entry
FROM meters
WHERE status_msg != 'Normal'
ORDER BY ts DESC
LIMIT 100;
场景 C: 数据导出标识
目的:为批量数据导出生成唯一标识。
应用示例:
-- 生成导出数据标识
SELECT CONCAT('EXPORT_', device_id, '_', CAST(YEAR(ts) AS VARCHAR),CAST(MONTH(ts) AS VARCHAR),CAST(DAY(ts) AS VARCHAR)) AS export_id,COUNT(*) AS record_count
FROM meters
WHERE ts >= '2024-01-01 00:00:00'AND ts < '2024-01-02 00:00:00'
GROUP BY device_id, YEAR(ts), MONTH(ts), DAY(ts);
场景 D: 设备状态通知
目的:生成包含详细信息的设备状态通知消息。
应用示例:
-- 生成设备状态通知
SELECT ts,CONCAT('设备 ', device_id, ' 在 ', location, ' 区域状态变更为: ', status_msg) AS notification_message
FROM meters
WHERE status_msg IN ('Warning', 'Error', 'Alert')
ORDER BY ts DESC
LIMIT 20;
注意事项
-
NULL 值传播:如果任一参数为 NULL,整个结果为 NULL。
-
参数数量限制:最少 2 个参数,最多 8 个参数。
-
类型转换:
- 如果参数中包含 NCHAR 类型,所有参数会被转换为 NCHAR
- 数值类型不会自动转换,需要使用 CAST 函数
-
字符串长度:
- 返回字符串长度为所有参数长度之和
- 注意不要超过 VARCHAR 或 NCHAR 的最大长度限制
-
性能考虑:
- 在大数据集上频繁连接长字符串可能影响性能
- 建议在应用层进行复杂的字符串处理
-
字符编码:
- VARCHAR 使用 UTF-8 编码
- NCHAR 使用 Unicode 编码
- 混合使用时注意字符编码转换
-
与 CONCAT_WS 的区别:
- CONCAT 不支持分隔符参数
- 需要分隔符时请使用 CONCAT_WS 函数
数学关系
基本定义:
CONCAT(s1, s2, ..., sn) = s1 || s2 || ... || sn
长度关系:
LENGTH(CONCAT(s1, s2, ..., sn)) = LENGTH(s1) + LENGTH(s2) + ... + LENGTH(sn)
NULL 规则:
如果存在 si = NULL,则 CONCAT(s1, s2, ..., sn) = NULL
相关函数
- CONCAT_WS:带分隔符的字符串连接函数
- CAST:类型转换函数,常与 CONCAT 配合使用
- LENGTH:返回字符串长度
- SUBSTRING:提取子字符串
- UPPER/LOWER:大小写转换
函数意义与价值
数学意义
CONCAT 函数实现了字符串的串联操作,是字符串代数中的基本运算。它遵循结合律,即 CONCAT(CONCAT(a,b),c) = CONCAT(a,CONCAT(b,c)),但不满足交换律。
实际应用价值
-
数据格式化
- 生成友好的显示格式
- 统一数据输出规范
- 提高数据可读性
-
标识符生成
- 创建唯一标识
- 组合键构建
- 复合索引支持
-
消息构建
- 动态消息生成
- 日志格式化
- 告警通知
-
路径构建
- 文件路径生成
- URL 构建
- 资源定位
-
数据导出
- 导出标签生成
- 文件命名
- 批次标识
本用户手册提供了 CONCAT 函数的完整使用说明,特别针对电力系统中的设备标识生成、日志格式化、状态通知等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
