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

相关推荐
zhixingheyi_tian3 小时前
一份GC日志的解读
java·开发语言
ywl4708120873 小时前
ArrayList和LinkedList内部的实现原理和区别
java·java基础
一只专注api接口开发的技术猿3 小时前
电商评论自动化监控与情感数据分析完整落地教程(附可直接运行 Python 代码)
大数据·数据库·python·数据分析·自动化
hh真是个慢性子3 小时前
GaussDB Inside 2.23.01.280 集中式一主一备安装
数据库·database·gaussdb·国产数据库·高斯
沉静的小伙3 小时前
Spring事务
java·数据库·spring
花燃柳卧3 小时前
跨平台路由组件工程源码补充上传
android·flutter·kotlin
大侠锅锅3 小时前
第 3 篇:节点自动化纳管——从裸机到可管理的 7 步安装流水线
数据库·自动化·边缘计算·iot
apihz3 小时前
随机驾考题目(C 照科一 / 科四 2000+ 题)免费API调用教程
android·java·c语言·开发语言·网络协议·tcp/ip
笃行3503 小时前
踩坑实战 | MySQL/PostgreSQL 迁移必踩:LEFT JOIN 莫名丢数据,KES 外连接消除避坑指南
数据库
摇滚侠3 小时前
Redis7 零基础到进阶 Linux 离线安装 Redis 09-10
数据库·redis·缓存