我需要在@min和@max之间选择所有数字N(整数) 如果不使用某种循环,有没有办法实现呢?
实施例: 我们假设@min = 5,@ max = 9
我需要SQL查询返回的以下值:5,6,7,8,9
(我正在使用MSSQL 2005)
谢谢!
编辑: 这是一个使用自定义函数的解决方案,工作正常。 但似乎需要手动循环遍历所有数字。 所以问题仍然是,没有循环是否可以实现。
CREATE FUNCTION GetAllNBetween
(
@Min int,
@Max int
)
RETURNS @N TABLE(n int)
AS
BEGIN
WHILE @Min <= @Max
BEGIN
INSERT INTO @N VALUES(@Min)
SET @Min = @Min + 1
END
RETURN
END
要像这样使用:
SELECT * FROM GetAllNBetween(5, 9)
答案 0 :(得分:2)
好吧,我不明白为什么你不想使用循环,但你可以改为使用递归。
DECLARE @min INT
DECLARE @max INT
SET @min = 5;
SET @max = 12;
WITH Nbrs ( n ) AS (
SELECT @min UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < @max
)
SELECT n FROM Nbrs
OPTION ( MAXRECURSION 500 )
它将生成一个包含所有值的表。从中生成字符串列表应该不会太难;)
答案 1 :(得分:2)
查询(由@Eric建议)
select ROW_NUMBER() OVER (ORDER BY so1.id) from sysobjects so1,sysobjects
在我大多数空的测试数据库中返回介于1和~3000之间的数字。您可以添加另一级sysobjects以获得疯狂的行数。那么过滤这个
就是一件简单的事情答案 2 :(得分:1)
您可以使用between关键字来执行此操作。这是一个例子。
select *
from tableName
where e_id between (SELECT min(e_id) FROM tableName a)
and (SELECT max(e_id) FROM tableName a)
如果你知道min和max,那么直接把它们放在那里而不是嵌套查询。
答案 3 :(得分:1)
试试这个:
DECLARE @min int, @max int
SELECT @Min=5,@Max= 9
SELECT TOP (@Max-@Min+1) @Min-1+row_number() over(order by t1.number) as N
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
输出:
N
--------------------
5
6
7
8
9
(5 row(s) affected)
请参阅上一个问题:What is the best way to create and populate a numbers table?
答案 4 :(得分:0)
试试这个
declare @min int
set @min= (select 5)
declare @max int
set @max=(select 9)
select * from table
where id between @min and @max
答案 5 :(得分:0)
你能使用这个函数row_number()吗?它是Mssql 2005中的新功能。
我还发现你也可以在ms sql 2005中执行此操作:
select *
from dbo.GetTableOfSequentialIntegers(100)
where number between 5 and 9
答案 6 :(得分:0)
我没有看到CTE(公用表表达式)的任何答案,所以这里是一个:
git remote -v