创建季节和年份列表作为常量值
Create list of Seasons and Years as Constant Values
我想生成一个季节和年份列表,即当前年份 + 未来 3 年的 (FA2019
、WI2019
、SP2019
、SU2019
)。这将被送入 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 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;
您可以使用 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 |
尝试以下操作:
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;
我想生成一个季节和年份列表,即当前年份 + 未来 3 年的 (FA2019
、WI2019
、SP2019
、SU2019
)。这将被送入 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 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;
您可以使用 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 |
尝试以下操作:
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;