SQL用于生成2个已知整数之间的有效值范围

时间:2011-02-15 15:57:32

标签: sql sql-server oracle

我需要编写一个SQL查询,它将生成一个有效整数列表,给出范围的开始和结束。

即给出下表: -

CMPY------MIN_YEAR------MAX_YEAR
PS--------2007----------2014

我想编写一个返回所有有效值的查询(针对CMPY),即: -

CMPY  YEAR
PS    2007
PS    2008
PS    2009
PS    2010
PS    2011
PS    2012
PS    2013
PS    2014

这需要适用于Oracle和SQL Server。

4 个答案:

答案 0 :(得分:3)

对于便携式解决方案,您可能需要创建一个简单的数字表,如下所示:

create table integers (val integer);

然后用尽可能多的行填充它。然后你的查询是:

select t.cmpy, i.val
from mytable t
join integers i on i.val between t.min_year and t.max_year;

答案 1 :(得分:3)

没有任何表的Oracle解决方案(您可以使用SQL Server的表方式):

SELECT a.cmpy, (a.min_year - 1) + LEVEL MIN_YEAR 
    FROM  YOUR_TABLE  a
  CONNECT BY (LEVEL-1) <= (MAX_YEAR - MIN_YEAR)                

e.g:

SELECT a.cmpy, (a.min_year - 1) + LEVEL MIN_YEAR 
    FROM (
                  SELECT 'PS' CMPY, 2007 MIN_YEAR, 2014 MAX_YEAR
                  FROM DUAL
                ) a
  CONNECT BY (LEVEL-1) <= (MAX_YEAR - MIN_YEAR)    

答案 2 :(得分:2)

查看您的数据,数字是多年。您可以在包含所有年份的两个服务器中创建一个表,然后加入它:

select  year.YearNr
from    YourTable yt
join    YearTable year
on      year.YearNr between yt.StartDate and yt.EndDate

这有效地为Oracle和SQL Server之间的每年创建一行。

答案 3 :(得分:2)

最有效的方法是使用Numbers(int num)表来查询以获取一系列数字,例如:

SELECT C.CMPY, N.num
FROM CMPY AS C
JOIN Numbers AS N
  ON N.num BETWEEN C.MIN_YEAR AND C.MAX_YEAR