How to generate a range of numbers between two numbers?

后端 未结 30 2259
执念已碎
执念已碎 2020-11-22 10:16

I have two numbers as input from the user, like for example 1000 and 1050.

How do I generate the numbers between these two numbers, using

30条回答
  •  無奈伤痛
    2020-11-22 10:18

    The solution I've developed and used for quite some time now (riding some on the shared works of others) is slightly similar to at least one posted. It doesn't reference any tables and returns an unsorted range of up to 1048576 values (2^20) and can include negatives if desired. You can of course sort the result if necessary. It runs pretty quickly, especially on smaller ranges.

    Select value from dbo.intRange(-500, 1500) order by value  -- returns 2001 values
    
    create function dbo.intRange 
    (   
        @Starting as int,
        @Ending as int
    )
    returns table
    as
    return (
        select value
        from (
            select @Starting +
                ( bit00.v | bit01.v | bit02.v | bit03.v
                | bit04.v | bit05.v | bit06.v | bit07.v
                | bit08.v | bit09.v | bit10.v | bit11.v
                | bit12.v | bit13.v | bit14.v | bit15.v
                | bit16.v | bit17.v | bit18.v | bit19.v
                ) as value
            from       (select 0 as v union ALL select 0x00001 as v) as bit00
            cross join (select 0 as v union ALL select 0x00002 as v) as bit01
            cross join (select 0 as v union ALL select 0x00004 as v) as bit02
            cross join (select 0 as v union ALL select 0x00008 as v) as bit03
            cross join (select 0 as v union ALL select 0x00010 as v) as bit04
            cross join (select 0 as v union ALL select 0x00020 as v) as bit05
            cross join (select 0 as v union ALL select 0x00040 as v) as bit06
            cross join (select 0 as v union ALL select 0x00080 as v) as bit07
            cross join (select 0 as v union ALL select 0x00100 as v) as bit08
            cross join (select 0 as v union ALL select 0x00200 as v) as bit09
            cross join (select 0 as v union ALL select 0x00400 as v) as bit10
            cross join (select 0 as v union ALL select 0x00800 as v) as bit11
            cross join (select 0 as v union ALL select 0x01000 as v) as bit12
            cross join (select 0 as v union ALL select 0x02000 as v) as bit13
            cross join (select 0 as v union ALL select 0x04000 as v) as bit14
            cross join (select 0 as v union ALL select 0x08000 as v) as bit15
            cross join (select 0 as v union ALL select 0x10000 as v) as bit16
            cross join (select 0 as v union ALL select 0x20000 as v) as bit17
            cross join (select 0 as v union ALL select 0x40000 as v) as bit18
            cross join (select 0 as v union ALL select 0x80000 as v) as bit19
        ) intList
        where @Ending - @Starting < 0x100000
            and intList.value between @Starting and @Ending
    )
    

提交回复
热议问题