创建季节和年份列表作为常量值

Create list of Seasons and Years as Constant Values

我想生成一个季节和年份列表,即当前年份 + 未来 3 年的 (FA2019WI2019SP2019SU2019)。这将被送入 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)

使用 cross joinconnect 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;

Demo

您可以使用 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

Returns:

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

Demo on DB Fiddle

尝试以下操作:

   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;