为了账号安全,请及时绑定邮箱和手机立即绑定

请问如何在两个数字之间生成一系列数字?

请问如何在两个数字之间生成一系列数字?

蝴蝶不菲 2019-11-05 09:04:19
如何在两个数字之间生成一系列数字?我有两个数字作为用户的输入,例如1000和1050.如何使用SQL查询在分隔行中生成这两个数字之间的数字?我想要这个: 1000  1001  1002  1003  .  .  1050
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

属性选择非持久化值。VALUES关键词。然后使用JOIN生成大量和大量的组合(可以扩展到创建数十万行和更多行)。

SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.nFROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)
     WHERE ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n BETWEEN @userinput1 AND @userinput2ORDER BY 1

演示

一种较短的备选办法,这并不容易理解:

WITH x AS (SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n))
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.nFROM x ones,  
   x tens,    
     x hundreds,  
          x thousandsORDER BY 1

演示



查看完整回答
反对 回复 2019-11-06
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

另一种解决方案是递归CTE:

DECLARE @startnum INT=1000DECLARE @endnum INT=1050;WITH gen AS (
    SELECT @startnum AS num    UNION ALL
    SELECT num+1 FROM gen WHERE num+1<=@endnum)SELECT * FROM genoption (maxrecursion 10000)


查看完整回答
反对 回复 2019-11-06
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

SELECT DISTINCT n = number 
FROM master..[spt_values] WHERE number BETWEEN @start AND @end

演示

请注意,该表的最大值为2048,因为这些数字有空白。

下面是一种稍微好一点的使用系统视图的方法(因为来自SQLServer 2005):

;WITH Nums AS(
  SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_objects 

)SELECT n FROM Nums 
WHERE n BETWEEN @start AND @endORDER BY n;




查看完整回答
反对 回复 2019-11-06
  • 3 回答
  • 0 关注
  • 526 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信