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

相关推荐
弘毅 失败的 mian2 小时前
C++、Java 还是测试开发?
java·c++·经验分享·笔记·测试开发·技术方向·就业
ihudfb_8912 小时前
C语言编译时不检查语法 | 编译器行为与语法错误处理解析
时序数据库
杜子不疼.2 小时前
【C++】 set/multiset底层原理与逻辑详解
java·开发语言·c++
YangYang9YangYan2 小时前
中专生学历提升与职业发展指南
大数据·人工智能·学习·数据分析
q***31892 小时前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
Macbethad2 小时前
如何用WPF做工控设置界面
java·开发语言·wpf
wudl55662 小时前
Flink20 SQL 窗口函数概述
服务器·数据库·sql
CodeAmaz2 小时前
使用责任链模式设计电商下单流程(Java 实战)
java·后端·设计模式·责任链模式·下单
Arva .2 小时前
MySQL 中的 MVCC
数据库·mysql