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 )) );
代码解释:
- 用递归CTE生成1到50的数字序列,用来定位字符串的每个字符位置
- 先通过
REGEXP '^[0-9]+$'过滤掉包含非数字的行 - 对递增/递减分别校验:如果所有相邻字符的差值都符合要求,就返回该行
方法二:自定义函数(更简洁易读)
如果你的数据库支持自定义函数(比如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
相关产品推荐
相关产品推荐

