[SQL] 데이터 병합 - COALESCE

2024. 8. 20. 17:52Language/SQL

 해당 함수는 NULL 값을 대체하기 위해 사용한다 배워 찾아보니 해당 목적이 주가 아니어서 이렇게 따로 정리하게 되었다. 물론 NULL 값 대체의 기능을 가지고 있지만 본디 주 목적은 두 컬럼을 합치는 기능을 하는 함수라고 한다.

 

1. 기본 문법

SELECT COALESCE(병합컬럼명1, 병합컬럼명2) 별명,	// 방법 - 1
       COALESCE(값1, 값2) 별명           	// 방법 - 2
FROM 테이블명

 

해당 함수의 작동 기준은 NULL 이다. 두 컬럼을 지정하면 아래와 같은 결과를 보인다.

  • 두 컬럼 값이 모두 NULL 일 경우 : NULL 이 병합컬럼 값이 됨
  • 두 컬럼 중 하나의 컬럼 값이 NULL 인 경우 : NULL 아닌 쪽의 컬럼 값이 병합컬럼 값이 됨
  • 두 컬럼 값이 모두 NULL 이 아닌 경우 : 먼저 지정한 컬럼 값이 병합컬럼 값이 됨

또한 컬럼뿐만 아니라 특정 값을 지정해서도 사용이 가능하다. '값1, 값2' 를 지정해 사용한 경우에도 위에 설명한 것과 동일하게 작동한다(물론 컬럼과 값을 섞어 지정해 사용하는 경우도 가능).

 

 

2. 사용 예시

 'food_orders' 와 'customers' 테이블을 JOIN 하여 데이터를 확인하던 중 고객의 이름(name)과 나이(age)가 NULL 인 다수의 레코드를 확인했다. 이 때, 해당 NULL  값들을 이름의 경우에는 "이름없음" 으로 나이인 경우에는 '20' 으로 바꿔 결과를 출력해보자.

SELECT a.order_id, a.customer_id, a.restaurant_name, b.name, b.age,
       COALESCE(name, '이름없음') '이름 NULL제거', COALESCE(age, '20') '나이 NULL제거'
FROM food_orders a LEFT JOIN customers b ON a.customer_id = b.customer_id
WHERE b.age IS NULL OR b.name IS NULL	// 데이터양이 많아 NULL 을 갖는 데이터만 추리기 위해 사용

NULL 을 제외하기 위한 컬럼 병합 결과

 

현재 DB 에 테스트 데이터가 너무 많아 부득이하게 'name' 또는 'age' 에 NULL 값을 갖는 레코드들만을 추려 예제를 진행하였다. COALESCE 를 사용했기에 기존 컬럼들의 값이 모두 NULL 이라 병합컬럼의 값들이 모두 지정한 "이름없음" 과 '20' 인 것을 확인 할 수 있다.

 

NULL 이 아닌 값을 갖는 컬럼 값의 경우

 

혹시나 하는 마음에 WHERE 의 조건을 지우고 'name' 과 'age' 에 NULL 이 아닌 값이 있는 경우도 한 번 확인 해보았다. COALESCE 사용 시 첫 번 째로 지정한 'name' 과 'age' 의 값들이 NULL 아니어서 해당 컬럼(age, name)의 값이 병합컬럼 값인 것을 확인 할 수 있었다.