상세 컨텐츠

본문 제목

pl/pgsql 활용하여 전체 DB에 있는 Data 조회 쿼리

postgre

by DHBAEK 2023. 5. 3. 02:47

본문

postgresql 에서 전체 DB에 있는 모든 테이블 및 컬럼에서 특정 값을 포함하는 Data 조회하는 쿼리 작성하였다.

 

처음 접해보는 개념이라 좀 빡세긴 했는데 역시 Gpt를 활용하여 시간을 단축하였다.

 

새별이라 피곤하니 설명은 생략./

create or replace function searchColumData(n text) -- 없으면 선언 있으면 재 선언
returns void as $$ -- 리턴 타입 void 및 $$는 $$안에 있는걸 다 함수로 취급
declare -- 변수 선언
	test RECORD; -- 레코드 타입
	test2 RECORD;
	table_name_co text;
	dynamic_query text;
begin -- 함수 실행
	for test in select * from information_schema.columns where table_catalog = 'ecvam' and table_schema = 'public' and data_type ='character varying' loop -- 반복문 실행
		if(test.table_name not like '%20%') then -- 조건문 실행 (postgre의 경우 숫자가 테이블 앞에 오는 경우는 조금 다르게 호출해야 해서 조건문 사용)
			table_name_co := CONCAT(test.table_schema,'.',test.table_name); -- 테이블 명 선언
			dynamic_query := format('SELECT %I FROM %I where %I like ', test.column_name ,table_name_co,test.column_name); -- 테이블 명과 조회된 컬럼 명으로 새로운 쿼리 만듬
			dynamic_query := replace(dynamic_query,'"',''); -- 이건 콤마 문제 때문에 안돌아가서 넣음
			dynamic_query := concat(dynamic_query,quote_literal(n)); -- 마찬가지
		else -- 이하 생략
			table_name_co := test.table_name;
			dynamic_query := format('SELECT %I FROM %I where %I like ', test.column_name ,table_name_co,test.column_name);
			dynamic_query := concat(dynamic_query,quote_literal(n));
		end if;
		--RAISE NOTICE '%', dynamic_query; 테스트 용
		for test2 in EXECUTE dynamic_query using n loop -- 새로 만든 쿼리 반복문
			RAISE NOTICE '테이블명: %, 컬럼명: %, 데이터명: %',table_name_co,test.column_name, test2; -- 리턴 타입입 void이기 때문에 메세지로 대체 콘솔이라고 생각하3
		end loop;
	end loop;
end;
$$ language plpgsql; -- 언어 선언

DROP FUNCTION IF EXISTS searchColumData(n text); -- 함수 만든거 지워주3

select searchColumData('%김%'); -- 꼭 변수에 like 조건절 기준으로 넣어야 함.

 

 

'postgre' 카테고리의 다른 글

postgre계층형 쿼리  (0) 2023.04.17
postgresql 기초 명령어  (0) 2023.01.25

관련글 더보기