TDengine 字符串函数 POSITION 用户手册

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);

使用示例(智能电表场景)

  1. 基本查找位置
sql 复制代码
SELECT tbname, location, POSITION('Floor' IN location) AS pos FROM test.meters;

用途:判断位置信息是否包含楼层关键字并返回其位置,方便后续 SUBSTRING 解析。

  1. 提取城市名称(基于 '-' 分隔格式)
sql 复制代码
SELECT
  tbname,
  location,
  SUBSTRING(location, 1, POSITION('-' IN location) - 1) AS city
FROM test.meters;

目的:从 location 中抽取城市用于分组或聚合统计(与 LOWER 配合可实现大小写无关分组)。

  1. 数据质量检测:查找不规范记录(缺少某关键字段)
sql 复制代码
SELECT tbname, location
FROM test.meters
WHERE POSITION('-' IN location) = 0;

目的:定位未按约定格式填写的位置信息,便于清洗。

  1. 条件筛选(楼层编号存在且在范围内)
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;

用途:快速筛选指定楼层范围内的设备用于巡检。

  1. 与 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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
ggabb1 分钟前
中文:承载文明,引领未来
大数据·人工智能
卷Java4 分钟前
Python字典:键值对、get()方法、defaultdict,附通讯录实战
开发语言·数据库·python
尽兴-6 分钟前
ElasticSearch 搜索相关性详解(含评分机制+自定义策略+多字段优化)
大数据·elasticsearch·搜索引擎·相关性·评分机制·自定义策略·多字段优化
wanhengidc7 分钟前
跨境云手机适用于哪些场景
大数据·运维·服务器·数据库·科技·智能手机
赫瑞10 分钟前
Java中的最长公共子序列——LCS
java·开发语言
木梯子13 分钟前
大数据+AI+人|扑兔AI打造企业智慧经营,落地全域获客
大数据·人工智能·数据挖掘
于先生吖13 分钟前
零基础开发国际版同城出行平台 JAVA 顺风车预约系统实战教学
java·开发语言
代码雕刻家13 分钟前
2.22.StringBuffer类的常见用法、
java·开发语言
yhole14 分钟前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
金融小师妹18 分钟前
基于AI多因子与流动性模型的黄金再定价分析:4500关口修复后的“黄金坑”是否成立?
大数据·svn·能源