首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在两个字母数字值之间生成一系列数字?

如何在两个字母数字值之间生成一系列数字?
EN

Stack Overflow用户
提问于 2020-06-11 00:00:10
回答 1查看 332关注 0票数 0

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

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

代码语言:javascript
复制
ID
---------
WAC01001
WAC01002
WAC01003
WAC01004
WAC01005
WAC01006
WAC01007
WAC01008
WAC01009
WAC01010
WAC01011
WAC01012

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

代码语言:javascript
复制
ID
-----
WAC01
WAC02
WAC03
WAC04
WAC05
WAC06
WAC07
WAC08
WAC09
WAC10
WAC11
WAC12

这些输入值的长度大小是不同的。其中一些字母表的前导为零,而有些则为零。​

EN

回答 1

Stack Overflow用户

发布于 2020-06-11 00:23:34

代码语言:javascript
复制
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,并且查询不会很快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62315003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档