选择@min和@max之间的所有N.

时间:2010-11-15 06:51:12

标签: sql sql-server

我需要在@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)

7 个答案:

答案 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