我有两个字母数字作为来自用户的输入,例如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这些输入值的长度大小是不同的。其中一些字母表的前导为零,而有些则为零。
发布于 2020-06-11 00:23:34
DECLARE @v1 varchar(32) = 'WAC01001',
@v2 varchar(32) = 'WAC01012';
-- where does the string switch to a numeric sequence?
DECLARE @pos int = PATINDEX('%[0-9]%', @v1);
;WITH y AS
(
SELECT
c = 2+LEN(@v1)-@pos, -- where sequence starts
prefix = LEFT(@v1, @pos-1), -- fixed portion at beginning
s = SUBSTRING(@v1, @pos, 32), -- start of numeric sequence
e = SUBSTRING(@v2, @pos, 32) -- end of numeric sequence
), nums AS
(
-- recursive CTE to generate all the numbers in the sequence
SELECT n = TRY_CONVERT(int, s), e FROM y
UNION ALL SELECT n + 1, e FROM nums WHERE n < e
)
SELECT q.ID FROM nums CROSS APPLY
(
SELECT ID = prefix + RIGHT(REPLICATE('0', c)
+ CONVERT(varchar(11), CONVERT(int, nums.n)), LEN(s))
FROM y
) AS q
ORDER BY q.ID OPTION (MAXRECURSION 32767);如果范围内的值不能超过100个,则可以省略OPTION (MAXRECURSION 32767)。如果您的范围内有超过32K的值,您将不得不更改32767到0,并且查询不会很快。
https://stackoverflow.com/questions/62315003
复制相似问题