
REPLACE 函数使用手册
函数定义
sql
REPLACE(expr, from_str, to_str)
功能说明
一句话描述: 将字符串中所有指定的子串替换为新的子串。
将字符串 expr 中所有的 from_str 子串替换为 to_str,返回替换后的结果。
参数说明
| 参数 | 说明 | 类型 | 必填 |
|---|---|---|---|
expr |
待处理的原始字符串 | VARCHAR、NCHAR | 是 |
from_str |
要被替换的子串 | VARCHAR、NCHAR | 是 |
to_str |
替换后的新子串 | VARCHAR、NCHAR | 是 |
返回值
- 类型 : 与输入参数
expr的原始类型相同(VARCHAR 或 NCHAR) - 长度: 根据替换结果动态确定
- NULL 处理: 任意参数为 NULL,返回 NULL
适用范围
- 数据类型: VARCHAR、NCHAR
- 适用于: 表和超级表
- 子查询: 支持内层和外层查询
版本
v3.3.3.0
基础示例
sql
-- 基本替换
taos> SELECT REPLACE('aabbccAABBCC', 'AA', 'DD');
replace('aabbccAABBCC', 'AA', 'DD') |
======================================
aabbccDDBBCC |
-- 替换空格为下划线
taos> SELECT REPLACE('hello world test', ' ', '_');
replace('hello world test', ' ', '_') |
========================================
hello_world_test |
-- 大小写敏感
taos> SELECT REPLACE('HELLO hello', 'hello', 'world');
replace('HELLO hello', 'hello', 'world') |
===========================================
HELLO world |
-- 子串不存在
taos> SELECT REPLACE('tdengine', 'xyz', 'abc');
replace('tdengine', 'xyz', 'abc') |
====================================
tdengine |
-- 替换为空字符串(删除子串)
taos> SELECT REPLACE('test_data_base', '_', '');
replace('test_data_base', '_', '') |
=====================================
testdatabase |
-- NULL 值处理
taos> SELECT REPLACE(NULL, 'a', 'b');
replace(null, 'a', 'b') |
==========================
NULL |
taos> SELECT REPLACE('test', NULL, 'b');
replace('test', null, 'b') |
=============================
NULL |
taos> SELECT REPLACE('test', 'a', NULL);
replace('test', 'a', null) |
=============================
NULL |
使用场景示例
场景 1: 标准化设备位置格式
业务需求: 统一设备位置信息中的分隔符格式
sql
-- 创建智能电表超级表
CREATE STABLE test.meters (
`ts` TIMESTAMP,
`current` FLOAT,
`voltage` INT,
`phase` FLOAT
) TAGS (
`groupid` INT,
`location` VARCHAR(100)
);
-- 插入测试数据(使用不同分隔符)
INSERT INTO test.d001 USING test.meters TAGS(1, 'Beijing_Chaoyang_Building_A')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);
INSERT INTO test.d002 USING test.meters TAGS(2, 'Shanghai.Pudong.Tower.B')
VALUES ('2024-01-15 08:00:00', 12.3, 221, 0.88);
INSERT INTO test.d003 USING test.meters TAGS(3, 'Guangzhou-Tianhe-Plaza-C')
VALUES ('2024-01-15 08:00:00', 9.8, 219, 0.82);
-- 统一替换为标准分隔符 '-'
SELECT
tbname,
location AS original_location,
REPLACE(REPLACE(location, '_', '-'), '.', '-') AS standardized_location,
voltage
FROM test.meters;
输出示例:
tbname | original_location | standardized_location | voltage
-------|-----------------------------|-----------------------------|--------
d001 | Beijing_Chaoyang_Building_A | Beijing-Chaoyang-Building-A | 220
d002 | Shanghai.Pudong.Tower.B | Shanghai-Pudong-Tower-B | 221
d003 | Guangzhou-Tianhe-Plaza-C | Guangzhou-Tianhe-Plaza-C | 219
目的: 数据标准化,便于后续统一处理和查询
场景 2: 设备编号格式转换
业务需求: 将设备编号中的特殊字符替换为标准格式
sql
-- 假设增加设备编号标签
ALTER STABLE test.meters ADD TAG device_no VARCHAR(50);
-- 插入数据
INSERT INTO test.d004 USING test.meters
TAGS(4, 'Beijing-test', 'METER#2024#001')
VALUES ('2024-01-15 08:00:00', 11.0, 222, 0.88);
INSERT INTO test.d005 USING test.meters
TAGS(5, 'Shanghai-test', 'METER#2024#002')
VALUES ('2024-01-15 08:00:00', 10.2, 219, 0.86);
-- 将 '#' 替换为 '-'
SELECT
tbname,
device_no AS original_no,
REPLACE(device_no, '#', '-') AS formatted_no
FROM test.meters
WHERE device_no IS NOT NULL;
输出示例:
tbname | original_no | formatted_no
-------|-----------------|---------------
d004 | METER#2024#001 | METER-2024-001
d005 | METER#2024#002 | METER-2024-002
目的: 设备编号标准化,符合系统命名规范
场景 3: 数据脱敏处理
业务需求: 对敏感信息进行脱敏显示
sql
-- 假设增加联系电话标签
ALTER STABLE test.meters ADD TAG contact_phone VARCHAR(20);
-- 插入数据
INSERT INTO test.d006 USING test.meters
TAGS(6, 'Beijing-test', '', '13812345678')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);
-- 使用子查询实现电话号码中间4位脱敏
```sql
SELECT
tbname,
contact_phone AS original_phone,
CONCAT(
SUBSTRING(contact_phone, 1, 3),
'****',
SUBSTRING(contact_phone, 8)
) AS masked_phone
FROM test.meters
WHERE contact_phone IS NOT NULL;
输出示例:
tbname | original_phone | masked_phone
-------|----------------|-------------
d006 | 13812345678 | 138****5678
目的: 保护用户隐私,敏感信息脱敏显示
场景 4: URL 地址清理
业务需求: 清理设备监控 URL 中的多余参数
sql
-- 假设增加监控URL标签
ALTER STABLE test.meters ADD TAG monitor_url VARCHAR(200);
-- 插入数据
INSERT INTO test.d007 USING test.meters
TAGS(7, 'Beijing-test', '', '', 'http://monitor.com/device?id=001&debug=true')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);
-- 移除调试参数
SELECT
tbname,
monitor_url AS original_url,
REPLACE(monitor_url, '&debug=true', '') AS cleaned_url
FROM test.meters
WHERE monitor_url IS NOT NULL;
输出示例:
tbname | original_url | cleaned_url
-------|---------------------------------------------|---------------------------
d007 | http://monitor.com/device?id=001&debug=true | http://monitor.com/device?id=001
目的: URL 标准化,移除不必要的参数
场景 5: 批量文本替换
业务需求: 批量更新设备位置中的旧区域名称
sql
-- 查询需要更新的设备
SELECT
tbname,
location AS old_location,
REPLACE(location, 'OldDistrict', 'NewDistrict') AS new_location
FROM test.meters
WHERE location LIKE '%OldDistrict%';
-- 使用子查询统计替换前后差异
SELECT
COUNT(*) AS total_affected,
SUM(CASE WHEN old_location != new_location THEN 1 ELSE 0 END) AS changed_count
FROM (
SELECT
location AS old_location,
REPLACE(location, 'OldDistrict', 'NewDistrict') AS new_location
FROM test.meters
) AS subquery;
目的: 批量数据维护,区域名称更新
场景 6: 多层嵌套替换
业务需求: 执行多次字符串替换操作
sql
-- 多次替换:统一格式 + 移除空格
SELECT
tbname,
location AS original,
final_location
FROM (
SELECT
tbname,
location,
REPLACE(
REPLACE(
REPLACE(location, '_', '-'),
'.', '-'
),
' ', ''
) AS final_location
FROM test.meters
) AS subquery;
输出示例:
tbname | original | final_location
-------|------------------------------|----------------------
d001 | Beijing_Chaoyang Building_A | Beijing-ChaoyangBuilding-A
目的: 复杂字符串清理,多步骤标准化
实际应用优势
1. 数据清洗
sql
-- 清理多余空格
SELECT REPLACE(REPLACE(REPLACE(text_field, ' ', ' '), ' ', ' '), ' ', ' ')
FROM table_name;
2. 格式标准化
sql
-- 统一日期分隔符
SELECT REPLACE(date_string, '/', '-') FROM records;
3. 字符串修正
sql
-- 修正拼写错误
SELECT REPLACE(content, 'teh', 'the') FROM documents;
性能考虑
- 字符串长度: 替换操作的性能与字符串长度和替换次数成正比
- 多次替换: 使用嵌套 REPLACE 时注意性能影响
- 大数据集: 在大表上执行替换操作时建议加 WHERE 条件过滤
- 索引失效: WHERE 子句中使用 REPLACE 会导致索引无法使用
注意事项
- 大小写敏感: REPLACE 函数区分大小写
- 多字节安全: 正确处理 UTF-8 多字节字符(如中文)
- NULL 处理: 任何参数为 NULL 都返回 NULL
- 嵌套使用: TDengine 不支持在 SELECT 中直接引用前面定义的列别名,需要使用子查询
- 替换顺序: 多次嵌套替换时注意执行顺序,从内到外
子查询使用说明
由于 TDengine 不支持以下语法:
sql
-- ❌ 错误写法
SELECT
REPLACE(location, '_', '-') AS step1,
REPLACE(step1, '.', '-') AS step2 -- 无法引用 step1
FROM test.meters;
应使用以下方式:
sql
-- ✅ 正确写法 1: 嵌套函数
SELECT
REPLACE(REPLACE(location, '_', '-'), '.', '-') AS result
FROM test.meters;
-- ✅ 正确写法 2: 子查询
SELECT
step1,
REPLACE(step1, '.', '-') AS step2
FROM (
SELECT REPLACE(location, '_', '-') AS step1
FROM test.meters
) AS subquery;
相关函数
SUBSTR()/SUBSTRING(): 提取子串CONCAT(): 字符串连接TRIM(): 去除空格UPPER()/LOWER(): 大小写转换LENGTH(): 获取字符串长度POSITION(): 查找子串位置
完整示例: 设备信息标准化
sql
-- 综合应用: 设备信息清理与标准化
SELECT
tbname,
standardized_location,
standardized_device_no,
cleaned_url
FROM (
SELECT
tbname,
REPLACE(REPLACE(REPLACE(location, '_', '-'), '.', '-'), ' ', '') AS standardized_location,
REPLACE(device_no, '#', '-') AS standardized_device_no,
REPLACE(monitor_url, '&debug=true', '') AS cleaned_url
FROM test.meters
WHERE location IS NOT NULL
) AS subquery
WHERE standardized_location != ''
ORDER BY tbname;
这个综合示例展示了如何使用 REPLACE 函数实现:
- 多种分隔符统一
- 空格清理
- 特殊字符标准化
- URL 参数清理
- 批量数据标准化处理
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。