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;

注意事项

  1. NULL 值传播:如果任一参数为 NULL,整个结果为 NULL。

  2. 参数数量限制:最少 2 个参数,最多 8 个参数。

  3. 类型转换

    • 如果参数中包含 NCHAR 类型,所有参数会被转换为 NCHAR
    • 数值类型不会自动转换,需要使用 CAST 函数
  4. 字符串长度

    • 返回字符串长度为所有参数长度之和
    • 注意不要超过 VARCHAR 或 NCHAR 的最大长度限制
  5. 性能考虑

    • 在大数据集上频繁连接长字符串可能影响性能
    • 建议在应用层进行复杂的字符串处理
  6. 字符编码

    • VARCHAR 使用 UTF-8 编码
    • NCHAR 使用 Unicode 编码
    • 混合使用时注意字符编码转换
  7. 与 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)),但不满足交换律。

实际应用价值

  1. 数据格式化

    • 生成友好的显示格式
    • 统一数据输出规范
    • 提高数据可读性
  2. 标识符生成

    • 创建唯一标识
    • 组合键构建
    • 复合索引支持
  3. 消息构建

    • 动态消息生成
    • 日志格式化
    • 告警通知
  4. 路径构建

    • 文件路径生成
    • URL 构建
    • 资源定位
  5. 数据导出

    • 导出标签生成
    • 文件命名
    • 批次标识

本用户手册提供了 CONCAT 函数的完整使用说明,特别针对电力系统中的设备标识生成、日志格式化、状态通知等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

posted on 2025-12-01 14:50  ljbguanli  阅读(0)  评论(0)    收藏  举报