pg REGEXP_SPLIT_TO_ARRAY 질문 0 5 869

by 웅아 [2021.08.10 17:32:37]


이미지 10.png (1,722Bytes)

WITH COPYT_ AS
(
 SELECT generate_series AS LV
   FROM generate_series(1,5)
),
COPYL_ AS
(
 SELECT REGEXP_SPLIT_TO_ARRAY('202104;202105;202106', ';') AS S_NM
  WHERE 1 = 1
)
SELECT S_NM[LV] AS TT
  FROM COPYT_ A
 INNER JOIN
       COPYL_ B
    ON A.LV <= ARRAY_LENGTH(B.S_NM, 1)
 WHERE 1 = 1
 

--결과값

202104
202105
202106

 

제가 하고 싶은건 날짜를 파라미터로 202104 , 202107 요 두가지만 받으면

아래와 같이 나오게 하고 싶습니다.

혹시 위와 같은 방법이 아닌 더 쉬운 방법이 있어도 괜찮습니다.

202104
202105
202106
202107

by 웅아 [2021.08.10 17:43:34]
SELECT DISTINCT TO_CHAR(D, 'YYYYMM') AS VALUE
  FROM (
        SELECT A.DATE + B.IDX AS D 
          FROM (
                SELECT TO_DATE(REPLACE('202101','-', ''),'YYYYMM')::DATE AS DATE 
               ) A 
         CROSS JOIN 
               ( 
                SELECT GENERATE_SERIES(0, 9999) AS IDX 
               ) B
       ) T
 WHERE D::DATE <= TO_DATE(REPLACE('202105','-', ''),'YYYYMM')::DATE
 ORDER BY VALUE

 


by 마농 [2021.08.10 17:58:50]

비효율이 많이 보이네요.
테스트 환경이 안되서 추측성 답변 달아 봅니다.
TO_DATE() 가 날짜 함수이니 ::DATE 를 통한 형변환은 불필요해 보입니다.
알리아스는 date 와 같은 예약어 사용은 피하는 게 좋습니다.
ROW_NUMBER() 부분도 불필요한 부분이구요.
날짜를 하루씩 더해 나가는 부분은 한달씩 더하는 방향으로 개선해 보세요.
불필요한 인라인뷰도 제거할 필요가 있습니다.
(SELECT generate_series(0, 9999) AS IDX) B 부분은
인라인뷰 없이 바로 generate_series 사용하시면 됩니다.


by 웅아 [2021.08.11 08:53:26]

감사합니다!


by 뉴비디비 [2021.08.10 19:48:49]
SELECT 
	TO_CHAR(A, 'YYYYMM') as TT
FROM 
	GENERATE_SERIES( TO_DATE('202104', 'YYYYMM'), TO_DATE('202107', 'YYYYMM'), INTERVAL '1 MONTH') A

 


by 웅아 [2021.08.11 08:53:48]

와 이렇게 간단하게도 할 수 있는거였군요 바로 교체 합니당!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입