首页 > 解决方案 > 如何生成两个字母数字值之间的数字范围?

问题描述

我有两个字母数字作为用户的输入,例如 WAC01001 和 WAC01012。

如何使用 SQL 查询在单独的行中生成这两个值之间的数字?我要这个

ID
---------
WAC01001
WAC01002
WAC01003
WAC01004
WAC01005
WAC01006
WAC01007
WAC01008
WAC01009
WAC01010
WAC01011
WAC01012

同样,对于 WAC01 和 WAC12,预期结果将是

ID
-----
WAC01
WAC02
WAC03
WAC04
WAC05
WAC06
WAC07
WAC08
WAC09
WAC10
WAC11
WAC12

这些输入值的长度大小不一。其中一些在字母后有前导零,而另一些则没有。</p>

标签: sqlsql-serverstringselectrecursive-query

解决方案


这并不像看起来那么容易。字符串前缀的长度可能会有所不同;并且数字部分可能有前导零。

这是一种使用递归查询的方法。这个想法是首先将 sring 前缀与数字后缀分开(我假设字符串中第一个数字之后的所有内容),然后生成一系列数字,最后连接回字符串(相对于原始字符串的长度) .

declare @str1 nvarchar(max) = 'WAC01001';
declare @str2 nvarchar(max) = 'WAC01012';

with cte as (
    select 
        n,
        cast(substring(@str1, n, len(@str1)) as int) num,
        cast(substring(@str2, n, len(@str2)) as int) end_num,
        left(@str1, n - 1) prefix
    from (select patindex('%[0-9]%', @str1) n) x
    union all
    select 
        n,
        num + 1,
        end_num,
        prefix
    from cte 
    where num < end_num
)
select concat(
    prefix, 
    replicate('0', len(@str1) - n - len(num) + 1),
    num
) res
from cte
order by num

如果需要处理超过 100 个增量,则需要option (maxrecursion 0)在查询末尾添加。

DB Fiddle 上的演示

| 资源 |
| :------- |
| WAC01001 |
| WAC01002 |
| WAC01003 |
| WAC01004 |
| WAC01005 |
| WAC01006 |
| WAC01007 |
| WAC01008 |
| WAC01009 |
| WAC01010 |
| WAC01011 |
| WAC01012 |

推荐阅读