우선 postgresql v12이구요.
문제 상황을 설명드리면 업데이트 해야 하는 테이블이 있고,
업데이트 해야 하는 컬럼명과 값은 다른 테이블에 있는 상황입니다.
거기에 날짜까지 있어서 해당 날짜를 넘어가면 계속 업데이트해줘야 합니다. 설명이 어려우니 예시를 들어보겠습니다.
1. 업데이트 해야하는 테이블
KEY | DATE | COL1 | COL2 | COL3 |
K1 | 2017 | 0 | 0 | 0 |
K1 | 2018 | 0 | 0 | 0 |
K1 | 2019 | 0 | 0 | 0 |
K2 | 2018 | 0 | 0 | 0 |
2. 업데이트 정보가 들어있는 테이블 (DATE 기준으로 소팅되어 있음)
KEY | DATE | COLNAME | VALUE |
K1 | 2017 | COL1 | 3 |
K1 | 2018 | COL1 | 5 |
K1 | 2018 | COL3 | 7 |
K1 | 2019 | COL2 | 9 |
K2 | 2018 | COL3 | 11 |
3. 최종적으로 업데이트된 테이블
KEY | DATE | COL1 | COL2 | COL3 |
K1 | 2017 | 3 | 0 | 0 |
K1 | 2018 | 5 | 0 | 7 |
K1 | 2019 | 5 | 9 | 7 |
K2 | 2018 | 0 | 0 | 11 |
실제 테이블에서는 업데이트 해야하는 컬럼이 몇백개 되어서 다이나믹(?) 하게 처리하고 싶은데요.
이게 업무 관련해서 처리해야하는거라 sql 기초도 없는데 해야되는 상황입니다ㅠㅠ
아래는 제가 작성한 코드인데 자꾸 if 구문에서 에러가 뜨더라구요. 근데 if 구문만 execute 없이 do begin 구문으로 감싸서 실행하면 잘 동작합니다; 어떻게 해야 할까요?
CREATE OR REPLACE FUNCTION upadate_func() RETURNS void AS $BODY$ DECLARE r table1%rowtype; lr text; BEGIN -- r is a structure that contains an element for each column in the select list FOR r IN select * from table1 LOOP lr := LOWER(r.item); EXECUTE 'IF ' || '''' || lr || '''' || ' IN (SELECT item FROM colname_table) THEN' || ' UPDATE table3' || ' SET ' || lr || ' = ' || r.value || ' WHERE key = ' || '''' || r.key || '''' || ' AND date >= '|| 'CAST(' || '''' || r.date || '''' || ' AS TIMESTAMP);' || ' END IF;'; END LOOP; END $BODY$ LANGUAGE plpgsql;
SELECT update_func();