sql - 如何生成两个字母数字值之间的数字范围?
问题描述
我有两个字母数字作为用户的输入,例如 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>
解决方案
这并不像看起来那么容易。字符串前缀的长度可能会有所不同;并且数字部分可能有前导零。
这是一种使用递归查询的方法。这个想法是首先将 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)
在查询末尾添加。
| 资源 | | :------- | | WAC01001 | | WAC01002 | | WAC01003 | | WAC01004 | | WAC01005 | | WAC01006 | | WAC01007 | | WAC01008 | | WAC01009 | | WAC01010 | | WAC01011 | | WAC01012 |
推荐阅读
- sql - 获得前 40% 的用户基础销售额
- html - 开发工具(移动)和移动设备之间的差异
- sql - 使用 SQL 按给定数据元素显示小计
- javascript - 生成动态 div 并检索输入元素的值
- react-native - React Native Flex Child Growth 似乎受 Padding 影响
- javascript - 是否有解决“无效值”的方法?
- acl - HSQLDB服务器ACL不生效
- kubernetes - 如何通过 values.yml 将多个 docker 图像传递给 Helm 中的 template.yml
- php - 图像不会从 mysql 显示
- c++ - 这个 C++ 语句中的方括号是什么意思?