如何在两个数字之间创建数字范围?
How to create numbers range of numbers between two numbers?
所以我有 Table 并且我有列 NumberMin(最小数)和 NumberMax(最大数)
我有很多记录,我想 select 所有数据,在新列中,我的数字介于最小值和最大值之间,就像这样
这是 table
ID Name NumberMin NumberMax
13 Jhon 10 14
当我select我想成为这样
Name NumberMin NumberMax newcolum
Jhon 10 14 10
Jhon 10 14 11
Jhon 10 14 12
Jhon 10 14 13
我试过这段代码,但没有像这样工作
;with numcte
AS
(
SELECT NumbMin as[SEQUENCE]
UNION all
SELECT Name,NumbMin,NumbMax,[SEQUENCE] + 1 FROM Table WHERE NumbMin <NumbMax
)
SELECT * FROM numcte
您的查询的问题是查询的锚点和递归部分必须具有相同的列数(和相同的数据类型)。你的锚点只有一列(numberMin
),而递归部分有4列,所以查询错误。
考虑:
with numcte as (
select id, name, numberMin, numberMax, numberMin newcol from mytable
union all
select id, name, numberMin, numberMax, newcol + 1
from numcte
where newcol < numberMax - 1
)
select * from numcte
where
条件阻止 newcol
的最后一个值实际达到 numberMax
- 这有点不寻常,但这正是您想要的结果。
注意SQL服务器默认限制递归查询的迭代次数为100次,如果需要处理更多,需要在末尾添加option (maxrecursion 0)
查询。
您可以使用递归 CTE 来执行此操作。
例如:
with
x as (
select ID, Name, NumberMin, NumberMax, NumberMin as cur from t
UNION ALL
select ID, Name, NumberMin, NumberMax, cur + 1
from x
where cur < NumberMax - 1
)
select * from x
结果:
ID Name NumberMin NumberMax cur
-- ---- --------- --------- ---
13 John 10 14 10
13 John 10 14 11
13 John 10 14 12
13 John 10 14 13
参见 DB<>Fiddle 中的 运行 示例。
另一种选择是临时计数 table。
不确定您是否要排除最高值 (14)。如果是这样,只需删除 Select top(...)
中的 +1
例子
Select A.*
,NewColumn = NumberMin+B.N-1
From YourTable A
Cross Apply (
Select Top (NumberMax-NumberMin+1) N=row_number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2
) B
Returns
所以我有 Table 并且我有列 NumberMin(最小数)和 NumberMax(最大数) 我有很多记录,我想 select 所有数据,在新列中,我的数字介于最小值和最大值之间,就像这样 这是 table
ID Name NumberMin NumberMax
13 Jhon 10 14
当我select我想成为这样
Name NumberMin NumberMax newcolum
Jhon 10 14 10
Jhon 10 14 11
Jhon 10 14 12
Jhon 10 14 13
我试过这段代码,但没有像这样工作
;with numcte
AS
(
SELECT NumbMin as[SEQUENCE]
UNION all
SELECT Name,NumbMin,NumbMax,[SEQUENCE] + 1 FROM Table WHERE NumbMin <NumbMax
)
SELECT * FROM numcte
您的查询的问题是查询的锚点和递归部分必须具有相同的列数(和相同的数据类型)。你的锚点只有一列(numberMin
),而递归部分有4列,所以查询错误。
考虑:
with numcte as (
select id, name, numberMin, numberMax, numberMin newcol from mytable
union all
select id, name, numberMin, numberMax, newcol + 1
from numcte
where newcol < numberMax - 1
)
select * from numcte
where
条件阻止 newcol
的最后一个值实际达到 numberMax
- 这有点不寻常,但这正是您想要的结果。
注意SQL服务器默认限制递归查询的迭代次数为100次,如果需要处理更多,需要在末尾添加option (maxrecursion 0)
查询。
您可以使用递归 CTE 来执行此操作。
例如:
with
x as (
select ID, Name, NumberMin, NumberMax, NumberMin as cur from t
UNION ALL
select ID, Name, NumberMin, NumberMax, cur + 1
from x
where cur < NumberMax - 1
)
select * from x
结果:
ID Name NumberMin NumberMax cur
-- ---- --------- --------- ---
13 John 10 14 10
13 John 10 14 11
13 John 10 14 12
13 John 10 14 13
参见 DB<>Fiddle 中的 运行 示例。
另一种选择是临时计数 table。
不确定您是否要排除最高值 (14)。如果是这样,只需删除 Select top(...)
例子
Select A.*
,NewColumn = NumberMin+B.N-1
From YourTable A
Cross Apply (
Select Top (NumberMax-NumberMin+1) N=row_number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2
) B
Returns