代码之家  ›  专栏  ›  技术社区  ›  Sam7

在@min和@max之间选择所有N

  •  2
  • Sam7  · 技术社区  · 14 年前

    我需要选择@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 回复  |  直到 14 年前
        1
  •  2
  •   Damien_The_Unbeliever    14 年前

    查询(由@Eric建议)

    select ROW_NUMBER() OVER (ORDER BY so1.id) from sysobjects so1,sysobjects
    

    返回在我的空测试数据库中介于1和~3000之间的数字。您可以添加另一个级别的sysobjects来获得疯狂的行数。那么过滤这个就很简单了

        2
  •  2
  •   user503034    14 年前

    我不明白为什么你不想使用循环,但是你可以使用递归。

    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 )
    

    它将生成一个包含所有值的表。从中生成字符串列表应该不会太难;)

        3
  •  1
  •   Community CDub    8 年前

    试试这个:

    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
  •  1
  •   ahsteele tungi52    9 年前

    你可以用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,那么直接放置它们而不是嵌套查询。

        5
  •  0
  •   anishMarokey FIre Panda    14 年前

    试试这个

    declare @min int
    
    set @min= (select 5)
    
     declare @max int
    
    set @max=(select 9)
    
    select * from table
    
    where id between @min and @max
    
        6
  •  0
  •   ahsteele tungi52    9 年前

    您能使用这个函数row_number()吗?这是Mssql 2005的新功能。

    另外,我刚刚发现,在ms sql 2005中也可以这样做:

    select *
      from dbo.GetTableOfSequentialIntegers(100)
     where number between 5 and 9
    
        7
  •  0
  •   Peter Martini    8 年前

    我还没有看到CTE(公共表表达式)的任何答案,下面是一个:

    WITH RECURSIVE integers(n)
    AS (
      SELECT @min
      UNION SELECT n + 1 FROM integers WHERE n < @max
    ) SELECT n FROM integers