You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL统计TEST表指定字符串左侧空格数并获取其位置?

解决TEST表的SQL统计需求

针对TEST表的两个需求,给出以下SQL实现方案:

需求1:统计"EFD"左侧的空格数量

通过提取"EFD"之前的子串,计算该子串原长度与移除所有空格后的长度差值,即可得到左侧空格总数:

length(regexp_substr(Value, '^(.*?)EFD', 1, 1, 'n', 1)) - length(replace(regexp_substr(Value, '^(.*?)EFD', 1, 1, 'n', 1), ' ', '')) AS LEFT_SPACE_COUNT
  • 说明:regexp_substr(Value, '^(.*?)EFD', 1, 1, 'n', 1) 提取"EFD"之前的所有字符;replace(..., ' ', '') 移除子串中的空格,两者长度差即为空格数。

需求2:获取"EFD"在空格分割序列中的位置

统计"EFD"之前的空格数量,再加1就是它在序列中的位置(示例结果为3):

regexp_count(Value, ' ', 1, 'n', 1, instr(Value, 'EFD') - 1) + 1 AS SEQUENCE_POSITION
  • 说明:instr(Value, 'EFD') - 1 定位到"EFD"前一个字符的位置;regexp_count 统计该范围内的空格数,加1后得到序列位置。

完整SQL语句(Oracle环境)

SELECT ID,
       VALUE,
       regexp_substr(Value, 'EFD') AS "SUBSTRING",
       -- 需求1:左侧空格数
       length(regexp_substr(Value, '^(.*?)EFD', 1, 1, 'n', 1)) - length(replace(regexp_substr(Value, '^(.*?)EFD', 1, 1, 'n', 1), ' ', '')) AS LEFT_SPACE_COUNT,
       -- 需求2:序列位置
       regexp_count(Value, ' ', 1, 'n', 1, instr(Value, 'EFD') - 1) + 1 AS SEQUENCE_POSITION
FROM TEST;

如果是MySQL 8.0+环境,可调整为以下写法:

SELECT ID,
       VALUE,
       SUBSTRING_INDEX(VALUE, 'EFD', 1) AS BEFORE_EFD,
       -- 需求1:左侧空格数
       LENGTH(SUBSTRING_INDEX(VALUE, 'EFD', 1)) - LENGTH(REPLACE(SUBSTRING_INDEX(VALUE, 'EFD', 1), ' ', '')) AS LEFT_SPACE_COUNT,
       -- 需求2:序列位置
       REGEXP_COUNT(SUBSTRING_INDEX(VALUE, 'EFD', 1), ' ') + 1 AS SEQUENCE_POSITION
FROM TEST;

内容的提问来源于stack exchange,提问作者Artosu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:20:25