본문 바로가기
백엔드(Back End)/DataBase

SQL(4)-COALESCE함수에 대해 정확히 알아보기

by tjsdn9803 2023. 6. 6.

1. 개요

https://school.programmers.co.kr/learn/courses/30/lessons/131114

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 SQL문제를 풀던 중 해당값이 NULL일때 NULL으로 나타내는것이 아닌 'N'으로 나타내라는 문제를 만났다.

이런 상황을 만나본적이 없어 검색을 통해 COALESCE(freezer_yn, 'N')을 사용하여 컬럼 freezer_yn이 NULL이 아니라면 그대로 반환하고 만약 NULL이라면 'N'을반환하는 방식으로 문제를 해결하였다. 

처음보는 함수였기에 항해99 개강 준비 과정 중 문제 현황판에 어려웠지만 해결하였음으로 표시하였고, 그날 저녁 기술 매니저님과의 시간에서 기술 매니저님이 이 문제는 왜 체크가 되어있는지 물으셔서 이러한 상황을 설명하였다.

그런데 기술 매니저님이 말씀해주시길 COALESCE함수를 사용하여 이번 문제를 잘 해결하였지만 COALESCE함수가 내가 생각하는 것과 조금 다를것이라고 말씀해주셔서 COALESCE함수에 대해 공부해 보았고 COALESCE에 대해 더 자세히 알수있었다.

2. 내가 생각한 COALESCE

문제 풀이를 하며 내가 생각한 COALESCE함수의 사용법은 COALESCE함수에는 인자가 두개 들어가며 마치 조건문을 사용하듯

COALESCE(a, 'N'){
	if(a != NULL){
		return a;
	}else if(a == NULL){
		return 'N';
    }
}

의 과정으로 사용하는 함수라 생각하였다.

3. 정확한 COALESCE

하지만 COALESCE에 대해 좀더 공부해본 결과 내가 알고있던 것과 조금은 다름을 알 수 있었다.

정확한 COALESCE함수의 정의는 

인수를 순서대로 평가하고 처음으로 NULL이 아닌 첫 번째 식의 현재 값을 반환합니다.

이었다. 

즉, COALESCE함수는 인자를 두개만 가지는 것이 아닌 여러 인자를 가질 수 있었고 인자를 순서대로 평가하며 처음으로 NULL이 아닌 첫번째 인자를 반환하는 것이었다.

COALESCE ( expression [ ,...n ] )

위 함수를 CASE, WHEN문법으로 다시 바꿔쓰면 다음과 같이 표현 할 수 있다.

CASE  
WHEN (expression1 IS NOT NULL) THEN expression1  
WHEN (expression2 IS NOT NULL) THEN expression2  
...  
ELSE expressionN  
END

즉 개요에서 프로그래머스 문제에서 COALESCE를 사용 할때는

freezer_yn 이 NULL이 아니라면  freezer_yn이 NULL이 아닌 첫번째 인자이기 때문에 freezer_yn을 반환하게되는것이고

freezer_yn이 NULL이라면 freezer_yn은 NULL이기 때문에 넘어간 후 두번째 인자인 'N'을 검사하게 되고 'N:은 NULL이 아닌 첫번째 인자이기 때문에 'N'을 반환한 것이었다.

4. 사용 예

SELECT COALESCE ('A', 'B', 'C') from DUAL UNION ALL
SELECT COALESCE (NULL, 'B', 'C') from DUAL UNION ALL
SELECT COALESCE (NULL, NULL, 'C') from DUAL UNION ALL
SELECT COALESCE (NULL, NULL, NULL) from DUAL

이제 정확한 COALESCE함수에 대해 알았으니 인자가 두개 이상일때에도 어떤 값이 나올지 예상 할 수 있다.

첫번째 줄의 경우 A, B, C를 차례대로 평가하는데 처음 NULL이 아닌 인자는 'A'이므로 'A'를 반환하였다.

두번째 줄의 경우 NULL, B, C를 차례대로 평가하는데 처음 NULL이 아닌 인자는 'B'이므로 'B'를 반환하였다.

마지막 줄의 경우 NULL, NULL, NULL을 차례대로 평가하는데 모든 인자가 NULL이기 때문에 NULL을 반환하였다.

 

레퍼런스:

https://learn.microsoft.com/ko-kr/sql/t-sql/language-elements/coalesce-transact-sql?view=sql-server-ver16

'백엔드(Back End) > DataBase' 카테고리의 다른 글

[TIL]20230731 - DB 정규화  (0) 2023.07.31
DB 트랜잭션(Transaction)  (0) 2023.06.19
SQL(3)-JOIN  (0) 2023.06.02
SQL(2)-GROUP BY, ORDER BY  (0) 2023.06.01
SQL(1)-SQL 기초, SELECT 쿼리  (0) 2023.06.01