SQL中筛选含至少两个连续数字的行(无法使用REPLACE函数)
筛选含连续数字的SQL行(无REPLACE函数场景)
原始数据
Col1 ------------ x1 x2,x3 x1,y5 y3,x5,x6 y6,y10,y11 x7,y8 y6,y9
需求说明
筛选Col1中**至少包含两个连续数字(忽略前缀字母)**的行,预期返回第2、4、5、6行;当前使用的SQL平台不支持REPLACE函数。
实现方案
核心思路
通过字符串定位函数拆分每行的元素,提取每个元素的纯数字部分,转为数值后判断是否存在相邻数字差值为1的情况。
示例SQL代码
WITH split_rows AS ( SELECT Col1, -- 提取第一个元素的数字部分 CAST( SUBSTRING( LEFT(Col1, CHARINDEX(',', Col1 + ',') - 1), PATINDEX('%[0-9]%', LEFT(Col1, CHARINDEX(',', Col1 + ',') - 1)), LEN(LEFT(Col1, CHARINDEX(',', Col1 + ',') - 1)) ) AS INT ) AS num1, -- 提取第二个元素的数字部分(存在则提取) CASE WHEN CHARINDEX(',', Col1) > 0 THEN CAST( SUBSTRING( SUBSTRING(Col1, CHARINDEX(',', Col1) + 1, CHARINDEX(',', Col1 + ',', CHARINDEX(',', Col1) + 1) - CHARINDEX(',', Col1) - 1), PATINDEX('%[0-9]%', SUBSTRING(Col1, CHARINDEX(',', Col1) + 1, CHARINDEX(',', Col1 + ',', CHARINDEX(',', Col1) + 1) - CHARINDEX(',', Col1) - 1)), LEN(SUBSTRING(Col1, CHARINDEX(',', Col1) + 1, CHARINDEX(',', Col1 + ',', CHARINDEX(',', Col1) + 1) - CHARINDEX(',', Col1) - 1)) ) AS INT ) END AS num2, -- 提取第三个元素的数字部分(存在则提取) CASE WHEN CHARINDEX(',', Col1, CHARINDEX(',', Col1)+1) > 0 THEN CAST( SUBSTRING( RIGHT(Col1, LEN(Col1) - CHARINDEX(',', Col1, CHARINDEX(',', Col1)+1)), PATINDEX('%[0-9]%', RIGHT(Col1, LEN(Col1) - CHARINDEX(',', Col1, CHARINDEX(',', Col1)+1))), LEN(RIGHT(Col1, LEN(Col1) - CHARINDEX(',', Col1, CHARINDEX(',', Col1)+1))) ) AS INT ) END AS num3 FROM your_table_name ) SELECT Col1 FROM split_rows WHERE -- 判断相邻数字是否连续 (num2 IS NOT NULL AND num2 - num1 = 1) OR (num3 IS NOT NULL AND num3 - num2 = 1)
代码说明
- 用
CHARINDEX定位逗号位置,拆分出每行的1-3个元素; - 借助
PATINDEX('%[0-9]%', ...)找到每个元素中第一个数字的起始位置,再通过SUBSTRING提取纯数字内容并转为整数; - 最后通过判断相邻数字的差值是否为1,筛选出符合条件的行。
内容的提问来源于stack exchange,提问作者kiran h
相关产品推荐
相关产品推荐

