TDengine 字符串函数 REGEXP_IN_SET 用户手册

REGEXP_IN_SET 函数用户手册
函数定义
REGEXP_IN_SET(expr1, expr2[, expr3])
功能说明
一句话描述: 使用正则表达式在字符串列表中查找匹配项,返回第一个匹配成功的模式位置。
将 expr2 以 expr3 为分隔符切分为一个字符串列表,将 expr1 作为正则表达式匹配列表中的字符串,返回第一个匹配项的序号,无匹配项则返回 0。
参数说明
| 参数 | 说明 | 类型 | 必填 |
|---|---|---|---|
expr1 | 正则表达式模式 | VARCHAR、NCHAR | 是 |
expr2 | 待匹配的字符串列表(用分隔符分隔) | VARCHAR、NCHAR | 是 |
expr3 | 分隔符(默认为 ,) | VARCHAR、NCHAR | 否 |
说明:
expr3不可以是 NULL 或空串expr1必须是有效的正则表达式语法- 支持标准正则表达式元字符:
.*+?[]^$|()等
返回值
- 类型: BIGINT
- 返回: 第一个匹配的字符串在列表中的位置(从 1 开始)
- 无匹配: 返回 0
- NULL 值: 如果
expr1或expr2为 NULL,返回 NULL
适用范围
- 数据类型: VARCHAR、NCHAR
- 参数个数: 最小 2 个,最大 3 个
- 适用于: 表和超级表
- 子查询: 支持内层和外层查询
与相关函数的区别
| 函数 | 匹配方式 | 通配符 | 性能 | 适用场景 |
|---|---|---|---|---|
| REGEXP_IN_SET | 正则表达式 | 完整正则语法 | 最慢 | 复杂模式匹配 |
| LIKE_IN_SET | LIKE 模糊匹配 | % 和 _ | 较慢 | 简单通配符 |
| FIND_IN_SET | 精确匹配 | 不支持 | 最快 | 精确字符串 |
对比示例:
-- FIND_IN_SET: 精确匹配
SELECT FIND_IN_SET('Beijing-A1', 'Beijing,Shanghai,Guangzhou');
-- 返回: 0 (无精确匹配)-- LIKE_IN_SET: 简单通配符
SELECT LIKE_IN_SET('Beijing-A1', 'Beijing%,Shanghai%,Guangzhou%');
-- 返回: 1 (匹配 'Beijing%' 模式)-- REGEXP_IN_SET: 正则表达式
SELECT REGEXP_IN_SET('Beijing-A1', '^Beijing-[A-Z][0-9]+$,^Shanghai-.*,^Guangzhou-.*');
-- 返回: 1 (匹配第一个正则模式)
使用场景示例
场景 1: 智能电表设备编号验证
业务需求: 验证设备位置编码是否符合多种命名规范
-- 创建智能电表超级表
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-BJ-Building-A01-Floor-10')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);INSERT INTO test.d002 USING test.meters TAGS(2, 'Shanghai-SH-Tower-B23-Floor-20')
VALUES ('2024-01-15 08:00:00', 12.3, 221, 0.88);INSERT INTO test.d003 USING test.meters TAGS(3, 'Guangzhou-Invalid-Format')
VALUES ('2024-01-15 08:00:00', 9.8, 219, 0.82);INSERT INTO test.d004 USING test.meters TAGS(4, 'Shenzhen-SZ-Center-C99-Floor-30')
VALUES ('2024-01-15 08:00:00', 10.8, 220, 0.87);-- 使用正则表达式验证位置编码格式
-- 格式规范: 城市-代码-建筑类型-编号-Floor-楼层
SELECT tbname,location,REGEXP_IN_SET(location, '^[A-Za-z]+-[A-Z]{2}-[A-Za-z]+-[A-Z][0-9]{2}-Floor-[0-9]+$') AS format_check,CASE WHEN REGEXP_IN_SET(location, '^[A-Za-z]+-[A-Z]{2}-[A-Za-z]+-[A-Z][0-9]{2}-Floor-[0-9]+$') > 0 THEN '格式正确'ELSE '格式错误'END AS validation_result
FROM test.meters;
输出示例:
tbname | location | format_check | validation_result
-------|---------------------------------------------|--------------|-------------------
d001 | Beijing-BJ-Building-A01-Floor-10 | 1 | 格式正确
d002 | Shanghai-SH-Tower-B23-Floor-20 | 1 | 格式正确
d003 | Guangzhou-Invalid-Format | 0 | 格式错误
d004 | Shenzhen-SZ-Center-C99-Floor-30 | 1 | 格式正确
目的: 自动化数据质量检查,识别不符合命名规范的设备
场景 2: 多区域设备筛选(正则表达式)
业务需求: 筛选符合特定区域命名模式的设备
-- 筛选北京、上海、深圳区域的设备(支持多种命名格式)
-- 支持格式: Beijing/BJ/北京, Shanghai/SH/上海, Shenzhen/SZ/深圳
SELECT tbname,location,voltage,current,REGEXP_IN_SET(location,'^(Beijing|BJ|北京).*,^(Shanghai|SH|上海).*,^(Shenzhen|SZ|深圳).*') AS region_match_index
FROM test.meters
WHERE REGEXP_IN_SET(location,'^(Beijing|BJ|北京).*,^(Shanghai|SH|上海).*,^(Shenzhen|SZ|深圳).*'
) > 0;
输出示例:
tbname | location | voltage | current | region_match_index
-------|-------------------------------------|---------|---------|--------------------
d001 | Beijing-BJ-Building-A01-Floor-10 | 220 | 10.5 | 1
d002 | Shanghai-SH-Tower-B23-Floor-20 | 221 | 12.3 | 2
d004 | Shenzhen-SZ-Center-C99-Floor-30 | 220 | 10.8 | 3
目的: 实现灵活的多区域、多命名格式的设备筛选
场景 3: 设备型号识别
业务需求: 根据位置字符串识别建筑类型
-- 识别建筑类型(Building/Tower/Center/Plaza等)
SELECT tbname,location,CASE WHEN REGEXP_IN_SET(location, '-(Building|大楼)-') = 1 THEN 'Office Building'WHEN REGEXP_IN_SET(location, '-(Tower|塔楼)-') = 1 THEN 'High-rise Tower'WHEN REGEXP_IN_SET(location, '-(Center|中心)-') = 1 THEN 'Commercial Center'WHEN REGEXP_IN_SET(location, '-(Plaza|广场)-') = 1 THEN 'Shopping Plaza'ELSE 'Other'END AS building_type,voltage
FROM test.meters;
输出示例:
tbname | location | building_type | voltage
-------|-------------------------------------|------------------|--------
d001 | Beijing-BJ-Building-A01-Floor-10 | Office Building | 220
d002 | Shanghai-SH-Tower-B23-Floor-20 | High-rise Tower | 221
d004 | Shenzhen-SZ-Center-C99-Floor-30 | Commercial Center| 220
目的: 自动分类设备所属建筑类型
实际应用优势
1. 强大的模式匹配能力
-- 匹配多种日期格式
SELECT REGEXP_IN_SET('2024-01-15','^\d{4}-\d{2}-\d{2}$,^\d{2}/\d{2}/\d{4}$,^\d{8}$'
);
-- 可匹配: 2024-01-15, 01/15/2024, 20240115
2. 数据验证与清洗
-- 验证设备编号格式
SELECT * FROM test.meters
WHERE REGEXP_IN_SET(location,'^[A-Z]{2,}-[A-Z]{2}-[A-Za-z]+-[A-Z][0-9]+-Floor-[0-9]+$'
) = 0; -- 查找不符合格式的记录
3. 灵活的分组统计
-- 按建筑类型统计(支持中英文)
SELECT CASE WHEN REGEXP_IN_SET(location, '-(Building|大楼)-') > 0 THEN 'Building'WHEN REGEXP_IN_SET(location, '-(Tower|塔楼)-') > 0 THEN 'Tower'ELSE 'Other'END AS type,COUNT(*) AS count
FROM test.meters
GROUP BY type;
性能建议
- 复杂度控制: 正则表达式越复杂,性能越低
- 优先级选择:
- 精确匹配 → 使用
FIND_IN_SET - 简单通配符 → 使用
LIKE_IN_SET - 复杂模式 → 使用
REGEXP_IN_SET
- 精确匹配 → 使用
- 模式数量: 建议单次查询不超过 10 个正则模式
- 索引无法使用: WHERE 中使用正则函数无法利用索引
注意事项
- 正则语法: 必须符合标准正则表达式语法
- 大小写敏感: 默认区分大小写,需要时使用
(?i)标志 - 转义字符: 特殊字符需要转义,如
\.\+\* - NULL 处理: 任何参数为 NULL 都返回 NULL
- 性能影响: 在大数据集上谨慎使用
- 分隔符限制: 分隔符不能为 NULL 或空字符串
正则表达式语法速查
| 元字符 | 说明 | 示例 |
|---|---|---|
. | 匹配任意单个字符 | a.c 匹配 abc、a1c |
* | 匹配前面字符 0 次或多次 | ab*c 匹配 ac、abc |
+ | 匹配前面字符 1 次或多次 | ab+c 匹配 abc、abbc |
? | 匹配前面字符 0 次或 1 次 | ab?c 匹配 ac、abc |
^ | 匹配字符串开始 | ^abc 匹配以 abc 开头 |
$ | 匹配字符串结束 | abc$ 匹配以 abc 结尾 |
[...] | 字符类,匹配括号内任一字符 | [abc] 匹配 a、b、c |
[^...] | 否定字符类 | [^abc] 匹配除 a、b、c 外 |
\d | 匹配数字,等价于 [0-9] | \d+ 匹配一个或多个数字 |
\w | 匹配字母、数字、下划线 | \w+ 匹配单词 |
\s | 匹配空白字符 | \s+ 匹配空格、制表符 |
| ` | ` | 或运算符 |
() | 分组 | (ab)+ 匹配 ab、abab |
相关函数
FIND_IN_SET(): 精确匹配版本LIKE_IN_SET(): LIKE 通配符匹配版本LIKE: 单模式 LIKE 匹配POSITION(): 子串位置查找
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
