SQL для генерации диапазона допустимых значений между 2 известными целыми числами - PullRequest
3 голосов
/ 15 февраля 2011

Мне нужно написать 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 ]

3 голосов
/ 15 февраля 2011

Решение для 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)                

например:

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)    
3 голосов
/ 15 февраля 2011

Для портативного решения вы можете создать простую таблицу чисел, такую ​​как:

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;
2 голосов
/ 15 февраля 2011

Наиболее эффективный способ сделать это - иметь таблицу чисел (int num), которую можно запросить, чтобы получить диапазон чисел, например ::100100

SELECT C.CMPY, N.num
FROM CMPY AS C
JOIN Numbers AS N
  ON N.num BETWEEN C.MIN_YEAR AND C.MAX_YEAR
2 голосов
/ 15 февраля 2011

Глядя на ваши данные, цифры - это годы. Вы можете создать таблицу на обоих серверах, содержащую все годы, а затем присоединиться к ней:

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

Это фактически создает строку для каждого промежуточного года как в Oracle, так и в SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...