Давайте рассмотрим трюк для создания последовательности неких значений в языке SQL не вручную, а при помощи средств автоматизации. В последующем эти последовательности можно использовать, например, при проверке соблюдения неких условий.
Так, поставим цель создания последовательности лет с 1993 г. по 2021 г. (годы существования американской лиги по смешанным единоборствам - UFC). Начнем с простого и зададим набор из 10 цифр:
SELECT 0 AS y UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
Для формирования этого запроса используется операция объединения результатов - UNION, о которой я писал ранее.
В целевой последовательности рассмотренные единицы лет представляют структурный элемент наряду с десятками - 199, 200, 201, 202. Поэтому одним из вариантов реализации поставленной задачи является комбинирование десятков и единиц. Чтобы получить все пары, можно задать декартово произведение, например так:
WITH dec_t AS (SELECT 199 AS decade UNION SELECT 200 UNION SELECT 201 UNION SELECT 202),
y_t AS (SELECT 0 AS y UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)
SELECT * FROM dec_t,y_t
ORDER BY decade DESC, y
Мы вывели все строки из декартового произведения двух таблиц (присутствуют комбинации всех пар), каждую из которых сформировали при помощи подзапроса.
Напоследок осталось склеить результаты (CONCAT) и преобразовать к типу даты (TO_DATE, операции работы со строками освещались здесь, а с датой здесь). Также очистим данные, так как нас не интересуют годы до 1993 и после 2021:
WITH dec_t AS (SELECT 199 AS decade UNION SELECT 200 UNION SELECT 201 UNION SELECT 202 ),
y_t AS (SELECT 0 AS y UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)
SELECT TO_DATE(CONCAT(decade, y),'YYYY') AS year FROM dec_t,y_t
WHERE TO_DATE(CONCAT(decade, y),'YYYY') > TO_DATE('1992','YYYY') AND TO_DATE(CONCAT(decade, y),'YYYY') < TO_DATE('2022','YYYY')
ORDER BY year
Аналогичный результат получим, если убрать годы с началом - 202 и вручную добавить 2020, 2021:
WITH dec_t AS (SELECT 199 AS decade UNION SELECT 200 UNION SELECT 201),
y_t AS (SELECT 0 AS y UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)
SELECT TO_DATE(CONCAT(decade, y),'YYYY') AS year FROM dec_t,y_t
WHERE TO_DATE(CONCAT(decade, y),'YYYY') > TO_DATE('1992','YYYY')
UNION SELECT TO_DATE('2020','YYYY') UNION SELECT TO_DATE('2021','YYYY')
ORDER BY year
В завершении можно создать отдельное представление для хранения нашей последовательности, чтобы использовать его в будущем без написания громоздкого запроса:
CREATE VIEW y_years
AS
WITH dec_t AS (SELECT 199 AS decade UNION SELECT 200 UNION SELECT 201 UNION SELECT 202 ),
y_t AS (SELECT 0 AS y UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)
SELECT TO_DATE(CONCAT(decade, y),'YYYY') AS year FROM dec_t,y_t
WHERE TO_DATE(CONCAT(decade, y),'YYYY') > TO_DATE('1992','YYYY') AND TO_DATE(CONCAT(decade, y),'YYYY') < TO_DATE('2022','YYYY')
ORDER BY year