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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:07:29