쵸코코딩/DB

MSSQL - COALESCE()-ISNULL() 축약

OK_SON 2020. 6. 19. 11:11

 

COALESCE() 함수

 

구문 - COALESCE(expression1, …n)

지정한 표현식들 중에 NULL이 아니 첫 번째 값을 반환합니다. ISNULL()과 친척 관계입니다. 다중 ISNULL() 개념을 적용하고 싶을 때 이를 축약해서 사용할 수 있는 함수인 셈이죠.

온라인 설명서에는 이 함수가 다음과 같은 식이라고 소개합니다.

 

 

먼저 간단한 예제를 하나 보죠, 아래와 같이 3개의 변수값을 지정하면 NULL이 아닌 첫 번째 값, @C_Code 값을 반환하게 됩니다. 참고로 이걸 ISNULL()로 표현하면 어떻게 할 수 있을까도 생각해 보실 수 있겠죠.

DECLARE

        @A_Code int = NULL

,       @B_Code int = NULL

,       @C_Code int = 10248;

 

 

-- 다중 ISNULL() 축약식

SELECT COALESCE(@A_Code, @B_Code, @C_Code);

 

 

특징

함수에 입력되는 표현식이 모두 NULL일 경우엔 결과도 NULL이 반환됩니다.

DECLARE

        @A_Code int = NULL

,       @B_Code int = NULL

 

SELECT COALESCE(@A_Code, @B_Code);

 

-----------
NULL

 

그리고 NULL 값 상수만 지정하면 아래와 같이 오류가 발생합니다

 

메시지 4127, 수준 16, 상태 1, 1

COALESCE 인수 적어도 하나는 NULL 상수가 아닌 식이어야 합니다.

 

 

적용 시나리오

그렇다면 이 함수는 어떤 경우에 적용할 수 있을까요? 물론 단순히 ISNULL()의 대체용으로 사용하는 경우도 있지만 아래와 같은 데이터 모델을 생각해 보겠습니다.

배타적 OR 관계 열

엔터티(테이블)에서 두 개 이상의 속성() 중 하나의 값만 가지는 데이터 일 경우입니다. 예를 들어 고객 유형(개인, 기업 등), 급여 유형(시급, 주급, 월급 등) 등을 생각해 볼 수 있습니다. 아래 간단히 표현한 Sales 테이블의 A_Code, B_Code 둘 중 하나에는 검색 대상 코드가 입력되어 있습니다. 물론 어떤 유형인지를 CodeGubun 열이 나타내지만 지금은 논외로 하겠습니다.

CREATE TABLE dbo.Sales

(

        CodeGubun      tinyint

,       A_Code         int

,       B_Code         int

);

 

INSERT dbo.Sales

VALUES

        (0, 91830, NULL)

,       (1, NULL, 87661)

;

 

-- 어디에 코드값이 존재하는지 상관없이 최종 결과를 확인할 있습니다.

SELECT Code = COALESCE(A_Code, B_Code)

FROM dbo.Sales;

 

Code

-----------

91830

87661

 

 

재미난 응용

이 함수를 알고 있으면 특별한 경우에 유용하게 활용할 수도 있습니다. 관련해서 재미난 예제 코드를 하나를 추가합니다. 아래는 두 자리 비트(0/1) 값에 대한 Bitmap을 만드는 코드로 T-SQL 책에 나오는 예제를 좀 더 의미 있게 살짝 수정했습니다. 테이블 행 생성자 VALUES(), GROUP BY CUBE, POWER() 함수, Bitmap 등등 아주 간단한 쿼리 안에 많은 기능과 개념들이 담겨져 있습니다. 모르는 내용이 있다면 각자 공부해 보세요.

 

SELECT

        A = COALESCE(a, 1)

,       B = COALESCE(b, 1)

,       R = (COALESCE(a, 1) * POWER(2, 1)) + COALESCE(b, 1)

FROM (VALUES (0, 0)) AS b(a, b)

GROUP BY CUBE (a, b)

ORDER BY A ASC;

 

A           B           R

----------- ----------- -----------

0           0           0

0           1           1

1           0           2

1           1           3

 

[출처] COALESCE() 함수|작성자 김정선

'쵸코코딩 > DB' 카테고리의 다른 글

MSSQL - 중복ROW 출력  (0) 2020.06.19
MSSQL- ROLLUP / CUBE - GROUPING()  (0) 2020.06.19
MSSQL - COUNT() - GROUP BY 없이 Count  (0) 2020.06.19
MSSQL - ROW_NUMBER() - ORDER BY 정렬 없이 순번 부여  (0) 2020.06.19
MSSQL - ROLLUP / CUBE  (0) 2020.06.19