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

MSSQL 2012:检索列中含连续递增/递减数字的行

哈哈,这个数据清理的痛点我太懂了!遇到这种连续递增/递减的数字串,靠普通的正则或者字符串函数确实不好直接匹配。我给你整理了几种实用的SQL方案,不管你用的是MySQL、PostgreSQL还是其他支持标准SQL的数据库,都能找到适合的思路:

核心思路

要判断字符串是否是连续递增/递减的数字,本质是检查每一对相邻字符的ASCII差值是否固定为1(递增)或-1(递减)——因为数字字符的ASCII码是连续的(比如'0'=48,'1'=49,以此类推)。

方法一:通用SQL逐字符校验(无自定义函数)

这种方法不需要创建自定义函数,适合大多数数据库,核心是通过生成数字序列拆分字符串的相邻字符对,逐一校验差值:

以MySQL 8.0+为例(用CTE生成序列更灵活,适配varchar(50)的最大长度):

WITH RECURSIVE nums(n) AS (
  SELECT 1
  UNION ALL
  SELECT n+1 FROM nums WHERE n < 50 -- 匹配列的最大长度50
)
SELECT *
FROM your_table
WHERE 
  -- 先过滤非纯数字的行,避免干扰判断
  your_column REGEXP '^[0-9]+$'
  AND (
    -- 匹配连续递增数字(长度至少2)
    (LENGTH(your_column) >= 2 AND 
     NOT EXISTS (
       SELECT 1 FROM nums
       WHERE n < LENGTH(your_column)
         AND ASCII(SUBSTRING(your_column, n+1, 1)) - ASCII(SUBSTRING(your_column, n, 1)) != 1
     ))
    OR
    -- 匹配连续递减数字(长度至少2)
    (LENGTH(your_column) >= 2 AND 
     NOT EXISTS (
       SELECT 1 FROM nums
       WHERE n < LENGTH(your_column)
         AND ASCII(SUBSTRING(your_column, n, 1)) - ASCII(SUBSTRING(your_column, n+1, 1)) != 1
     ))
  );

代码解释:

  1. 用递归CTE生成1到50的数字序列,用来定位字符串的每个字符位置
  2. 先通过REGEXP '^[0-9]+$'过滤掉包含非数字的行
  3. 对递增/递减分别校验:如果所有相邻字符的差值都符合要求,就返回该行
方法二:自定义函数(更简洁易读)

如果你的数据库支持自定义函数(比如PostgreSQL、MySQL),可以写一个函数封装判断逻辑,后续调用更方便:

以PostgreSQL为例:

CREATE OR REPLACE FUNCTION is_consecutive_numbers(str text)
RETURNS boolean AS $$
DECLARE
  i integer;
  str_len integer;
BEGIN
  str_len := length(str);
  -- 长度小于2的直接排除
  IF str_len < 2 OR str !~ '^[0-9]+$' THEN
    RETURN false;
  END IF;

  -- 检查是否是递增序列
  FOR i IN 1..str_len-1 LOOP
    IF ascii(substr(str, i, 1)) + 1 != ascii(substr(str, i+1, 1)) THEN
      EXIT;
    END IF;
    -- 遍历到最后一位都符合,说明是递增
    IF i = str_len-1 THEN
      RETURN true;
    END IF;
  END LOOP;

  -- 检查是否是递减序列
  FOR i IN 1..str_len-1 LOOP
    IF ascii(substr(str, i, 1)) - 1 != ascii(substr(str, i+1, 1)) THEN
      RETURN false;
    END IF;
  END LOOP;

  RETURN true;
END;
$$ LANGUAGE plpgsql;

调用的时候就非常简洁了:

SELECT * FROM your_table WHERE is_consecutive_numbers(your_column);
注意事项
  • 一定要先过滤非纯数字的行:如果列里有字母、符号等非数字值,会导致ASCII差值判断出错,所以第一步要加纯数字校验
  • 如果你的数据库不支持CTE(比如老版本MySQL),可以把数字序列换成SELECT 1 UNION ALL SELECT 2 ... UNION ALL SELECT 50的形式,虽然繁琐但同样有效

内容的提问来源于stack exchange,提问作者Itay.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:38:16