[Oracle] LISTAGG

Oracle / / 2019. 8. 4. 11:32

데이터를 가지고 올 때 여러 행을 하나의 컬럼으로 가져와야할 경우가 있습니다. 이때 사용하는 것이 LISTAGG 함수입니다. 

 

사용방법은 다음과 같습니다. 

SELECT LISTAGG(가져올컬럼, 구분자) WITHIN GROUP (ORDER BY 순서컬럼)

예를 들어 보겠습니다. 먼저 다음과 같이 데이터를 삽입하겠습니다.

INSERT INTO USER (USER_NAME, FAVORITE_FOOD) VALUES('홍길동', '마라샹궈');
INSERT INTO USER (USER_NAME, FAVORITE_FOOD) VALUES('홍길동', '라면');
INSERT INTO USER (USER_NAME, FAVORITE_FOOD) VALUES('홍길동', '햄버거');
INSERT INTO USER (USER_NAME, FAVORITE_FOOD) VALUES('홍길동', '피자');

홍길동이 좋아하는 음식을 한줄로 표현해 보겠습니다.

SELECT  LISTAGG(FAVORITE_FOOD || ',') WITHIN GROUP (ORDER BY FAVORITE_FOOD) FAVORITE_FOODS
FROM    USER

결과는 다음과 같이 나올 것입니다.

FAVORITE_FOOD
라면, 마라샹궈, 피자, 햄버거

같은 데이터가 중복으로 있어서 하나의 데이터만 가지고 오고 싶은경우에는 정규식 치환을 이용하면 중복데이터를 제거할 수 있습니다.

SELECT  REGEXP_REPLACE(LISTAGG(FAVORITE_FOOD || ',') WITHIN GROUP (ORDER BY FAVORITE_FOOD), '([^,]+)(,\1)+', '\1') FAVORITE_FOODS
FROM USER

끝에 ','를 지워야할 경우 rtrim을 이용해서 지우면 됩니다.

'Oracle' 카테고리의 다른 글

[Oracle] FULL SCAN HINT  (0) 2019.09.09
[Oracle] TO_DATE 날짜 변환  (0) 2019.09.09
[Oracle] Merge문 사용  (0) 2019.07.18
[Oracle] 조인 방법 (use_nl, use_hash, use_merge)  (0) 2019.06.24
[Oracle] 테이블 조인 튜닝 (ordered, leading)  (0) 2019.06.24
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기