
POSITION 函数使用手册
函数概述
函数名称:POSITION
返回子串在目标字符串中首次出现的位置(1-based),不存在返回 0,参数为 NULL 返回 NULL。
语法
sql
POSITION(expr1 IN expr2)
参数说明
- expr1:要查找的子串,类型 VARCHAR/NCHAR,必填。
- expr2:被搜索的目标字符串,类型 VARCHAR/NCHAR,必填。
返回值
- 类型:BIGINT
- 说明:
- 返回子串在目标字符串中首次出现的位置,位置从 1 开始;
- 若未找到返回 0;
- 若任一参数为 NULL 返回 NULL;
- 空串视为可匹配,POSITION('' IN 'abc') 返回 1。
特性与注意事项
- 多字节安全:以字符为单元计算位置(对 UTF‑8 多字节字符正确处理)。
- 区分大小写:匹配时区分大小写,必要时与 LOWER/UPPER 联用。
- 返回值为 1-based;与某些编程语言的 0-based 索引不同。
- 可用于 WHERE、SELECT、子查询和聚合场景(配合子查询或 CASE 使用)。
智能电表示例数据结构
请参考或创建超级表与示例数据:
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-Floor-10')
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-Floor-20')
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-Floor-15')
VALUES ('2024-01-15 08:00:00', 9.8, 219, 0.82);
使用示例(智能电表场景)
- 基本查找位置
sql
SELECT tbname, location, POSITION('Floor' IN location) AS pos FROM test.meters;
用途:判断位置信息是否包含楼层关键字并返回其位置,方便后续 SUBSTRING 解析。
- 提取城市名称(基于 '-' 分隔格式)
sql
SELECT
tbname,
location,
SUBSTRING(location, 1, POSITION('-' IN location) - 1) AS city
FROM test.meters;
目的:从 location 中抽取城市用于分组或聚合统计(与 LOWER 配合可实现大小写无关分组)。
- 数据质量检测:查找不规范记录(缺少某关键字段)
sql
SELECT tbname, location
FROM test.meters
WHERE POSITION('-' IN location) = 0;
目的:定位未按约定格式填写的位置信息,便于清洗。
- 条件筛选(楼层编号存在且在范围内)
sql
-- 假设 Floor-10 的格式固定,先定位 'Floor-' 再截取数字(示意)
SELECT tbname, location
FROM test.meters
WHERE POSITION('Floor-' IN location) > 0
AND CAST(SUBSTRING(location, POSITION('Floor-' IN location) + 6) AS INT) BETWEEN 5 AND 20;
用途:快速筛选指定楼层范围内的设备用于巡检。
- 与 CASE 联用实现标签化
sql
SELECT
tbname,
CASE
WHEN POSITION('Pudong' IN location) > 0 THEN 'Pudong Area'
WHEN POSITION('Tianhe' IN location) > 0 THEN 'Tianhe Area'
ELSE 'Other'
END AS area
FROM test.meters;
目的:按地理关键词对设备打标签,便于统计和告警分组。
场景与目的汇总
- 字段解析:基于位置字符串拆分并提取子域(城市、楼栋、楼层),用于聚合统计与权限控制。
- 数据质量检查:发现不符合格式或缺少关键子串的记录,触发修正流程。
- 条件筛选与分组:在 WHERE/CASE 中以是否包含子串做筛选或分类(比 LIKE 更精确用于位置标记)。
- 自动化维护:配合 SUBSTRING、POSITION 可实现自动字段拆分与标准化策略,便于下游分析与告警。
性能建议
- POSITION 是字符串查找操作,对较短 TAG 字段开销小;在大规模数据中频繁使用时,建议先按时间或分区筛选再执行。
- 若需大量重复查询同一字段的解析,考虑在写入时做预处理并存储解析结果以减少实时计算开销。
相关函数
- SUBSTRING / SUBSTR:截取子串,常与 POSITION 配合使用。
- LIKE / LIKE_IN_SET / FIND_IN_SET:不同匹配语义(模糊/精确/集合匹配)。
- LOWER / UPPER:配合实现大小写不敏感查找。
- LENGTH / CHAR_LENGTH:用于校验字符串长度与存储评估。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。