TDengine 字符串函数 REGEXP_IN_SET 用户手册

REGEXP_IN_SET 函数用户手册

函数定义

sql 复制代码
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_SET LIKE 模糊匹配 %_ 较慢 简单通配符
FIND_IN_SET 精确匹配 不支持 最快 精确字符串

对比示例:

sql 复制代码
-- 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: 智能电表设备编号验证

业务需求: 验证设备位置编码是否符合多种命名规范

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-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: 多区域设备筛选(正则表达式)

业务需求: 筛选符合特定区域命名模式的设备

sql 复制代码
-- 筛选北京、上海、深圳区域的设备(支持多种命名格式)
-- 支持格式: 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: 设备型号识别

业务需求: 根据位置字符串识别建筑类型

sql 复制代码
-- 识别建筑类型(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. 强大的模式匹配能力

sql 复制代码
-- 匹配多种日期格式
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. 数据验证与清洗

sql 复制代码
-- 验证设备编号格式
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. 灵活的分组统计

sql 复制代码
-- 按建筑类型统计(支持中英文)
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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
珹洺2 小时前
Java-Spring入门指南(三十二)Android SQLite数据库实战
java·数据库·spring
hyiciw_6422 小时前
C语言编译成汇编 | 深入探讨C语言与汇编的转换及其优化
时序数据库
2501_941111252 小时前
自动化与脚本
jvm·数据库·python
合作小小程序员小小店2 小时前
web开发,在线%小区,物业%管理系统,基于idea,html,jsp,java,ssm,mysql数据库
java·数据库·mysql·jdk·intellij-idea
kamcml_2902 小时前
C语言编译器IDE生成APK | 使用C语言开发Android应用的解决方案
时序数据库
m***11902 小时前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
小吕学编程3 小时前
MySQL分区(Partition)实战指南
数据库·mysql
墨客希3 小时前
Django 学习指南
数据库·django·sqlite
e***58233 小时前
使用Django Rest Framework构建API
数据库·django·sqlite