表題の件、では代わりにストアド FUNCTION でも代替案があるのだろうが、
ストアド FUNCTION 定義の権限がない時、
WITH句で対応する方法がある。
数値の例
WITH generate_series(n) AS ( SELECT 1 FROM dual UNION ALL SELECT n + 1 FROM generate_series WHERE n + 1 <= 5 ) SELECT n AS A_NUM FROM generate_series
Oracle 11g 以降では、CONNECT BY level を使って
https://docs.oracle.com/cd/E16338_01/server.112/b56299/pseudocolumns001.htm#i1009261
1~10は、
SELECT level FROM dual CONNECT BY level <= 10
日付(加算+1day)の例⇒DATE型
WITH generate_series(n) AS ( SELECT SYSDATE FROM dual UNION ALL SELECT n + 1 FROM generate_series WHERE n + 1 < SYSDATE + 5 ) SELECT n AS A_DATA FROM generate_series
年度、年月の文字列で結果が欲しい時
2024 年度の 年4桁月2桁の文字列で、、、
ADD_MONTHS を使う
WITH generate_series(x) AS ( SELECT TO_DATE('2024-04-01','YYYY-MM-DD') FROM dual UNION ALL SELECT ADD_MONTHS(x, 1) FROM generate_series WHERE ADD_MONTHS(x, 1) < TO_DATE('2025-04-01','YYYY-MM-DD') ) SELECT TO_CHAR(x, 'YYYYMM') AS YEAR_MONTH FROM generate_series
結果
202404 202405 202406 202407 202408 202409 202410 202411 202412 202501 202502 202503
これら同じものを、PostgreSQL で書く時は、Oracle では、WITH句に 再帰の意味、RECURSIVE
を省略していたが、PostgreSQL では省略せずに、WITH RECURSIVE と記述する。
PostgreSQL の場合の同じ書き方
--- 数値 PostgreSQL の例 ---
WITH RECURSIVE generates(n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM generates WHERE n + 1 <= 5 ) SELECT n FROM generates
--- 日付 PostgreSQL の例 ---
WITH RECURSIVE generates(n) AS ( SELECT CURRENT_TIMESTAMP UNION ALL SELECT n + CAST('1 days' AS INTERVAL) FROM generates WHERE n + CAST('1 days' AS INTERVAL) < CURRENT_TIMESTAMP + CAST('5 days' AS INTERVAL) ) SELECT n AS A_DATA FROM generates
--- 年度の年月文字列 PostgreSQL の例 --
WITH RECURSIVE generates(x) AS ( SELECT to_timestamp('2024-04-01','YYYY-MM-DD') UNION ALL SELECT x + CAST('1 month' AS INTERVAL) FROM generates WHERE x + CAST('1 month' AS INTERVAL) < TO_DATE('2025-04-01','YYYY-MM-DD') ) SELECT TO_CHAR(x, 'YYYYMM') AS YEAR_MONTH FROM generates