TDengine 字符串函数 REGEXP_IN_SET 用户手册 - 教程

在这里插入图片描述

REGEXP_IN_SET 函数用户手册

函数定义

REGEXP_IN_SET(expr1, expr2[, expr3])

功能说明

一句话描述: 使用正则表达式在字符串列表中查找匹配项,返回第一个匹配成功的模式位置。

expr2expr3 为分隔符切分为一个字符串列表,将 expr1 作为正则表达式匹配列表中的字符串,返回第一个匹配项的序号,无匹配项则返回 0。

参数说明

参数说明类型必填
expr1正则表达式模式VARCHAR、NCHAR
expr2待匹配的字符串列表(用分隔符分隔)VARCHAR、NCHAR
expr3分隔符(默认为 ,)VARCHAR、NCHAR

说明:

  • expr3 不可以是 NULL 或空串
  • expr1 必须是有效的正则表达式语法
  • 支持标准正则表达式元字符: .*+?[]^$|()

返回值

  • 类型: BIGINT
  • 返回: 第一个匹配的字符串在列表中的位置(从 1 开始)
  • 无匹配: 返回 0
  • NULL 值: 如果 expr1expr2 为 NULL,返回 NULL

适用范围

  • 数据类型: VARCHAR、NCHAR
  • 参数个数: 最小 2 个,最大 3 个
  • 适用于: 表和超级表
  • 子查询: 支持内层和外层查询

与相关函数的区别

函数匹配方式通配符性能适用场景
REGEXP_IN_SET正则表达式完整正则语法最慢复杂模式匹配
LIKE_IN_SETLIKE 模糊匹配%_较慢简单通配符
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;

性能建议

  1. 复杂度控制: 正则表达式越复杂,性能越低
  2. 优先级选择:
    • 精确匹配 → 使用 FIND_IN_SET
    • 简单通配符 → 使用 LIKE_IN_SET
    • 复杂模式 → 使用 REGEXP_IN_SET
  3. 模式数量: 建议单次查询不超过 10 个正则模式
  4. 索引无法使用: WHERE 中使用正则函数无法利用索引

注意事项

  1. 正则语法: 必须符合标准正则表达式语法
  2. 大小写敏感: 默认区分大小写,需要时使用 (?i) 标志
  3. 转义字符: 特殊字符需要转义,如 \.\+\*
  4. NULL 处理: 任何参数为 NULL 都返回 NULL
  5. 性能影响: 在大数据集上谨慎使用
  6. 分隔符限制: 分隔符不能为 NULL 或空字符串

正则表达式语法速查

元字符说明示例
.匹配任意单个字符a.c 匹配 abca1c
*匹配前面字符 0 次或多次ab*c 匹配 acabc
+匹配前面字符 1 次或多次ab+c 匹配 abcabbc
?匹配前面字符 0 次或 1 次ab?c 匹配 acabc
^匹配字符串开始^abc 匹配以 abc 开头
$匹配字符串结束abc$ 匹配以 abc 结尾
[...]字符类,匹配括号内任一字符[abc] 匹配 abc
[^...]否定字符类[^abc] 匹配除 abc
\d匹配数字,等价于 [0-9]\d+ 匹配一个或多个数字
\w匹配字母、数字、下划线\w+ 匹配单词
\s匹配空白字符\s+ 匹配空格、制表符
``或运算符
()分组(ab)+ 匹配 ababab

相关函数

  • FIND_IN_SET(): 精确匹配版本
  • LIKE_IN_SET(): LIKE 通配符匹配版本
  • LIKE: 单模式 LIKE 匹配
  • POSITION(): 子串位置查找

关于 TDengine

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

posted @ 2025-12-15 08:13  clnchanpin  阅读(0)  评论(0)    收藏  举报