TDengine 字符串函数 CONCAT 用户手册

CONCAT 函数

语法

sql 复制代码
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)函数一起使用。

示例所用表与数据(可直接复制执行)

sql 复制代码
-- 建库与使用
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: 两个字符串连接

sql 复制代码
-- 连接两个常量字符串
taos> SELECT CONCAT('Hello', 'World');
 concat('Hello', 'World') |
===========================
 HelloWorld               |

-- 连接带空格的字符串
taos> SELECT CONCAT('Hello ', 'World');
 concat('Hello ', 'World') |
============================
 Hello World               |

示例 2: 多个字符串连接

sql 复制代码
-- 连接三个字符串
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 值处理

sql 复制代码
-- 包含 NULL 值
taos> SELECT CONCAT('Hello', NULL, 'World');
 concat('Hello', null, 'World') |
=================================
 NULL                           |

-- 所有参数为 NULL
taos> SELECT CONCAT(NULL, NULL);
 concat(null, null) |
=====================
 NULL               |

示例 4: 列数据连接

sql 复制代码
-- 连接两个列
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: 数值类型转换连接

sql 复制代码
-- 使用 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 和位置信息生成唯一的设备完整标识。

sql 复制代码
-- 生成设备完整标识
SELECT device_id,
       location,
       CONCAT(device_id, '@', location) AS full_device_id
FROM meters
GROUP BY device_id, location
ORDER BY device_id;

应用价值

  • 生成全局唯一标识
  • 便于设备追踪
  • 简化设备管理

示例 7: 格式化状态消息

目的:将状态信息格式化为易读的消息。

sql 复制代码
-- 格式化状态消息
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: 生成数据导出标签

目的:为导出数据生成包含多个信息的标签。

sql 复制代码
-- 生成数据导出标签
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: 构建告警消息

目的:动态构建包含设备信息和状态的告警消息。

sql 复制代码
-- 构建告警消息
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: 生成文件路径

目的:根据设备信息生成数据文件存储路径。

sql 复制代码
-- 生成文件路径
SELECT device_id,
       location,
       CONCAT('/data/', location, '/', device_id, '/metrics.log') AS file_path
FROM meters
GROUP BY device_id, location;

应用价值

  • 自动化文件管理
  • 规范化存储结构
  • 便于数据归档

示例 11: 创建显示标签

目的:为数据可视化创建友好的显示标签。

sql 复制代码
-- 创建可视化标签
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: 生成查询键

目的:组合多个字段创建复合查询键。

sql 复制代码
-- 生成复合查询键
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: 设备监控报表系统

目的:生成包含完整设备信息的监控报表。

应用示例

sql 复制代码
-- 生成设备监控报表
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: 日志记录系统

目的:生成结构化的日志记录。

应用示例

sql 复制代码
-- 生成结构化日志
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: 数据导出标识

目的:为批量数据导出生成唯一标识。

应用示例

sql 复制代码
-- 生成导出数据标识
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: 设备状态通知

目的:生成包含详细信息的设备状态通知消息。

应用示例

sql 复制代码
-- 生成设备状态通知
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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
one year.2 小时前
Linux:线程同步与互斥
java·开发语言
一 乐2 小时前
旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
开发语言·前端·数据库·vue.js·spring boot·后端·旅游
YDS8293 小时前
苍穹外卖 —— Spring Cache和购物车功能开发
java·spring boot·后端·spring·mybatis
苍老流年3 小时前
1. SpringBoot初始化器ApplicationContextInitializer使用与源码分析
java·spring boot·后端
劲墨难解苍生苦3 小时前
spring ai alibaba mcp 开发demo
java·人工智能
leonardee3 小时前
Spring 中的 @ExceptionHandler 注解详解与应用
java·后端
bing.shao3 小时前
如何降低redis哈希值冲突概率
数据库·redis·哈希算法
不爱编程的小九九3 小时前
小九源码-springboot103-踏雪阁民宿订购平台
java·开发语言·spring boot
Elieal3 小时前
Spring 框架核心技术全解析
java·spring·sqlserver