Создать список сезонов и лет как постоянные значения - PullRequest
3 голосов
/ 08 апреля 2019

Я хочу создать список сезонов и лет, то есть (FA2019, WI2019, SP2019, SU2019) для текущего года + 3 года вперед. Затем он будет передан в другой запрос в предложении WHERE.

Прямо сейчас у меня есть 4 утверждения для каждого сезона, что я просто UNION их вместе. Есть ли более короткий способ сделать это?

SELECT 'FA' || YYYY AS SSYYYY FROM (
SELECT to_number(to_char(SYSDATE, 'YYYY'))+LEVEL-1 AS YYYY FROM dual
CONNECT BY LEVEL <= 4)

UNION

SELECT 'WI' || YYYY AS SSYYYY FROM (
SELECT to_number(to_char(SYSDATE, 'YYYY'))+LEVEL-1 AS YYYY FROM dual
CONNECT BY LEVEL <= 4)

UNION

SELECT 'SP' || YYYY AS SSYYYY FROM (
SELECT to_number(to_char(SYSDATE, 'YYYY'))+LEVEL-1 AS YYYY FROM dual
CONNECT BY LEVEL <= 4)

UNION

SELECT 'SU' || YYYY AS SSYYYY FROM (
SELECT to_number(to_char(SYSDATE, 'YYYY'))+LEVEL-1 AS YYYY FROM dual
CONNECT BY LEVEL <= 4)

Ответы [ 3 ]

4 голосов
/ 08 апреля 2019

Вы можете использовать CROSS JOIN два CONNECT BY запроса, например:

SELECT s.SS || y.YYYY AS SSYYYY
FROM 
(
    SELECT to_number(to_char(SYSDATE, 'YYYY')) + LEVEL - 1 AS YYYY 
    FROM dual 
    CONNECT BY LEVEL <= 4
) y
CROSS JOIN (
    SELECT DECODE(level, 1, 'FA', 2, 'WI', 3, 'SP', 4, 'SU') AS SS 
    FROM dual 
    CONNECT BY LEVEL <= 4
) s
ORDER BY y.YYYY, s.SS

Возвраты:

| SSYYYY |
| :----- |
| FA2019 |
| SP2019 |
| SU2019 |
| WI2019 |
| FA2020 |
| SP2020 |
| SU2020 |
| WI2020 |
| FA2021 |
| SP2021 |
| SU2021 |
| WI2021 |
| FA2022 |
| SP2022 |
| SU2022 |
| WI2022 |

Демонстрация на DB Fiddle

3 голосов
/ 08 апреля 2019

Использование cross join с connect by level <= 4

select season||year as seasons
 from
(
select 'SU' as season from dual union all
select 'WI' from dual union all
select 'FA' from dual union all
select 'SP' from dual  
)
cross join
(
select to_char(sysdate,'yyyy') + level - 1 as year
  from dual 
connect by level <= 4)
order by seasons;

Демо

2 голосов
/ 09 апреля 2019

Попробуйте следующее:

   SELECT DECODE(MOD(level, 4), 1, 'FA', 2, 'WI', 3, 'SP', 'SU') ||   
          TO_CHAR(EXTRACT (YEAR FROM SYSDATE) + FLOOR((LEVEL-1) / 4))
     FROM DUAL 
  CONNECT BY LEVEL <= 16;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...