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

相关推荐
北京耐用通信31 分钟前
电磁阀通讯频频“掉链”?耐达讯自动化Ethernet/IP转DeviceNet救场全行业!
人工智能·物联网·网络协议·安全·自动化·信息与通信
天青Giser1 小时前
Android开发记录
android
一颗宁檬不酸1 小时前
文件管理知识点
数据库
1 小时前
达梦数据库-事务
数据库·达梦数据库·dm
子春一2 小时前
Flutter 与原生平台深度集成:打通 iOS 与 Android 的最后一公里
android·flutter·ios
开心香辣派小星2 小时前
23种设计模式-15解释器模式
java·设计模式·解释器模式
Halo_tjn2 小时前
虚拟机相关实验概述
java·开发语言·windows·计算机
网硕互联的小客服2 小时前
MYSQL数据库和MSSQL数据库有什么区别?分别适用于什么脚本程序?
数据库·mysql·sqlserver
ganshenml2 小时前
【GIT】Git 本地无法识别远程分支的原因与解决方法 not a valid ref
大数据·git·elasticsearch
小邓   ༽2 小时前
全场景Android测试:API、工具与案例,从TestCase到Mock类应用指南
android·android 测试·android 组件测试·mock 类·测试 api 应用·组件测试核心