TDengine 字符串函数 FIND_IN_SET 用户手册

FIND_IN_SET 函数使用手册
函数概述
函数名称: FIND_IN_SET
函数类型: 字符串标量函数
功能说明: 将字符串 expr2 以 expr3 为分隔符切分为一个字符串列表,返回 expr1 在该列表中的序号。如存在多个匹配项,则返回第一个匹配项的序号;不存在则返回 0。
支持版本: TDengine 3.0+
语法格式
FIND_IN_SET(expr1, expr2[, expr3])
参数说明
| 参数 | 说明 | 数据类型 | 是否必填 |
|---|---|---|---|
expr1 | 要查找的字符串 | VARCHAR、NCHAR | 是 |
expr2 | 被分割的源字符串列表 | VARCHAR、NCHAR | 是 |
expr3 | 分隔符(默认为,) | VARCHAR、NCHAR | 否 |
返回值
- 返回类型: BIGINT
- 返回说明:
- 找到匹配项:返回该项在列表中的位置序号(从1开始)
- 未找到匹配:返回 0
- 参数包含 NULL:返回 NULL
使用说明
- 序号从 1 开始计数
- 如果
expr3未指定,默认使用逗号,作为分隔符 expr3不可以是 NULL 或空字符串- 匹配时区分大小写
- 如果
expr1或expr2为 NULL,则返回 NULL - 适用于内层查询和外层查询
- 适用于表和超级表
使用场景示例
场景一:设备分组查询
业务背景: 电力运维系统需要快速查找特定设备所属的运维分组
-- 创建超级表
CREATE STABLE test.meters (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT
) TAGS (`groupid` INT, `location` VARCHAR(24)
);-- 插入测试数据
INSERT INTO test.d001 USING test.meters TAGS(1, 'Beijing-A1,Shanghai-B2,Guangzhou-C3')
VALUES ('2024-01-15 08:00:00', 10.5, 220, 0.85);-- 查询:判断设备是否属于上海区域
SELECT tbname,location,FIND_IN_SET('Shanghai-B2', location) as `position`,CASE WHEN FIND_IN_SET('Shanghai-B2', location) > 0 THEN '属于上海区域'ELSE '不属于上海区域'END as region_status
FROM test.meters;
输出示例:
tbname | location | position | region_status
-------|---------------------------------------|----------|---------------
d001 | Beijing-A1,Shanghai-B2,Guangzhou-C3 | 2 | 属于上海区域
目的: 快速定位设备所属区域,便于运维人员按区域筛选设备
场景二:告警级别筛选
业务背景: 根据电压异常情况筛选需要优先处理的告警
-- 定义告警级别列表
-- 高危:'critical',紧急:'urgent',警告:'warning'SELECT ts,tbname,voltage,CASE WHEN voltage > 240 THEN 'critical'WHEN voltage > 230 THEN 'urgent'WHEN voltage < 200 THEN 'critical'ELSE 'normal'END as alert_level
FROM test.meters
WHERE FIND_IN_SET(CASE WHEN voltage > 240 THEN 'critical'WHEN voltage > 230 THEN 'urgent'WHEN voltage < 200 THEN 'critical'ELSE 'normal'END, 'critical,urgent'
) > 0
ORDER BY ts DESC
LIMIT 10;
目的: 筛选出需要紧急处理的告警记录(critical 和 urgent 级别),提高运维响应效率
场景三:多标签设备过滤
业务背景: 设备带有多个运维标签,需要根据标签快速检索
-- 假设 location 字段存储多标签,如 'tag1|tag2|tag3'
CREATE STABLE test.device_tags (`ts` TIMESTAMP,`current` FLOAT
) TAGS (`tags` VARCHAR(100)
);-- 插入数据
INSERT INTO test.dev001 USING test.device_tags TAGS('high_priority|outdoor|solar_powered')
VALUES ('2024-01-15 10:00:00', 15.2);INSERT INTO test.dev002 USING test.device_tags TAGS('indoor|backup|grid_powered')
VALUES ('2024-01-15 10:00:00', 8.5);-- 查询:查找所有户外设备
SELECT tbname,`tags`,current,FIND_IN_SET('outdoor', `tags`, '|') as tag_position
FROM test.device_tags
WHERE FIND_IN_SET('outdoor', `tags`, '|') > 0;
输出示例:
tbname | tags | current | tag_position
--------|------------------------------------|---------|--------------
dev001 | high_priority|outdoor|solar_powered| 15.2 | 2
目的: 支持灵活的多维度标签检索,自定义分隔符适应不同数据格式
场景四:动态权限控制
业务背景: 根据用户权限列表判断是否有权限访问特定区域的设备数据
-- 模拟用户权限表(实际应用中可能从权限系统获取)
-- 假设当前用户权限: 'Beijing,Shanghai,Shenzhen'SELECT tbname,location,ts,voltage,current
FROM test.meters
WHERE FIND_IN_SET(location,'Beijing,Shanghai,Shenzhen'
) > 0
ORDER BY ts DESC
LIMIT 20;
目的: 实现基于权限的数据访问控制,用户只能看到授权区域的设备数据
注意事项
- 性能考虑: 对于大量数据,建议配合索引或时间范围过滤使用
- 大小写敏感: 字符串匹配区分大小写,必要时使用
UPPER()或LOWER()函数 - 分隔符选择: 避免使用数据中可能出现的字符作为分隔符
- NULL 处理: 确保关键字段不为 NULL,或在查询中添加 NULL 值判断
相关函数
LIKE_IN_SET: 使用 LIKE 运算符语义进行模糊匹配REGEXP_IN_SET: 使用正则表达式进行匹配POSITION: 查找子串位置SUBSTRING: 字符串截取
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
