바꿔야 할 테이블 컬럼이 다른 테이블의 값으로 있을 때 0 1 438

by 꿈꾸는게발자 [PL/SQL] [2019.11.08 23:32:56]


우선 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();

by 우리집아찌 [2019.11.11 12:58:39]

컬럼이 몇백개 인가요 로우가 몇백개 인가요?

컬럼이 몇개 안되면 경우에 맞춰서 몇번 업데이트 실행하는 방법도 있습니다

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