오라클에서 보통 CONCAT 함수는 컬럼과 컬럼을 붙일 때 쓴다.


SELECT CONCAT(col1, col2, ....) FROM 테이블


하면 결과적으로 SELECT col1 || col2 FROM 테이블 과 같은 뜻이 된다.


하나의 레코드에 있는 여러 컬럼들 혹은 표현식을 붙일 때 쓰는 셈...


그런데...


여러 행(레코드)로 나눠진 값을 붙이는 건 어떻게 할까. 이걸 SQL Query 가 아닌 Pro*C 나 Stored Procedure 에서는


변수에 값 집어넣고 Loop 돌리는 식으로 할텐데, Query 로 한 방에 안되나... 싶어 찾아봤더니...


SELECT col1, WM_CONCAT(col2)

FROM 테이블

GROUP BY col1


을 하면 col2 컬럼을 col1 별로 컴마( , )를 붙여서 출력해준다. 컴마가 붙는 게 싫으면


REPLACE(WM_CONCAT(col2), ',', '_')로 하면 컴마 대신에 언더바( _ )가 붙겠지.


덕분에 백업 스크립트 생성 query 만드는데 유용하게 잘 썼다.


SELECT  'TRUNCATE TABLE '
         || table_name
         || ';'
         || CHR(13)
         || 'INSERT INTO BAK_'
         || table_name
         || CHR(13)
         || '('
         || WMSYS.WM_CONCAT(column_name)
         || ')'
         || CHR(13)
         || 'SELECT '
         || WMSYS.WM_CONCAT(column_name)
         || CHR(13)
         || 'FROM '
         || table_name
         || CHR(13)
         || 'COMMIT;'
         script
FROM     ALL_TAB_COLS col
WHERE     col.owner = '오너'
AND      Col.table_name LIKE '%' || :table_name || '%'
GROUP BY table_name

;

profile

이브리타, 나의 에뜨와르
너와 내가 공유하는 추억
너와 내가 만들 추억