에루샤
erusya
Back-end Developer
Web Geek
Anime Otaku
에루샤 프로필 이미지
개발
백엔드

MySQL CONCAT 함수 및 NULL 처리 방법

이 글은 2년 이상 지난 이야기에요. 읽으실때 참고!

쿼리 작업하다가 데이터 합칠게 있어서 CONCAT 썼다가 안되는 문제 발생해서 문제 해결 후 잊어버릴까봐 작업 로그겸 기록 남깁니다.



CONCAT

MySQL 또는 MariaDB에서 한 개 이상의 문자열 데이터를 합치는 DB함수로서 CONCAT을 지원합니다.


SELECT CONCAT('Hello', ' ', 'World');

# Result
Hello WorldCopy

통상적으로는 두개의 유효한 문자열을 합치는데 큰 문제없이 사용할 수 있는 기능이긴한데, 합치는 값이 Null값을 가지고 있으면 결과값이 통째로 NULL이 나옵니다.


SELECT CONCAT('Hello', NULL, 'World');

# Result
NULLCopy


COALESCE

그럴땐 NULL값을 판독해 공백문자로 치환할 수 있는 COALESCE 함수와 같이 사용하면 원하는 쿼리결과를 얻을 수 있습니다.

COALESCE 함수는 값이 NULL인 문자를 주어진 문자열로 치환하는 함수입니다.

SELECT CONCAT('Hello', COALESCE(NULL, ''), 'World');

# Result
HelloWorldCopy

그래서 이렇게 NULL이 될 수있는 영역을 COALESCE로 감싸서 치환문자를 입력해주면 정상적으로 CONCAT이 작동합니다.

실제로 여러개의 컬럼을 결합하는 경우에 NULL이 있을 수 있는 컬럼에 전부 COALESCE로 감싸서 예외처리하듯이 아래처럼 표현할 수 있습니다.

SELECT CONCAT(SOCT_KEY, COALESCE(SOCT_NAME, ''), COALESCE(SOCT_NOTE, ''), COALESCE(SOCT_COMT_NOTE, ''))
FROM SOCIETY_VIEW;Copy

이렇게 해두면 NAME, NOTE 등의 컬럼값이 NULL이어도 CONCAT이 제대로 수행이 될것이다.


CONCAT_WS

이것과 비슷한 역할을 하는 CONCAT 파생함수가 하나있는데 그것이 바로 CONCAT_WS이다.
CONCAT과 다르게 맨앞의 파라미터는 값들 사이의 구분자(Separator)를 넣어주는 역할을 한다.

SELECT CONCAT_WS(', ', 'Apple', NULL, 'Banana', 'Cherry');

# Result
Apple, Banana, CherryCopy

이 함수는 기존 CONCAT과 다르게 NULL문자를 자동으로 제거해주는 특징을 가지고있다.
값을 나열한다면 CONCAT_WS를 쓰는것도 좋은 방법이다.

그래서 위의 COALESCE 함수를 쓴 예제는 아래와 같이 바꿀 수도 있을 것이다.

SELECT CONCAT_WS(' | ', SOCT_KEY, SOCT_NAME, SOCT_NOTE, SOCT_COMT_NOTE)
FROM SOCIETY_VIEW;Copy

보기는 편한데 이건 합쳐진 문자열의 포맷을 마음대로 할 수 없다는 작은 문제가 있긴하다.
뭐 필요한 방법으로 응용해서 쓸 수 있는 정도로 인지하면 좋을것이다.


결론

CONCAT(): 기본적인 문자열 연결, NULL이 있으면 전체가 NULL이 됨.
COALESCE(): NULL 값을 공백('')으로 변환하여 NULL 방지.
CONCAT_WS(): 구분자(,, |, - 등)를 포함하여 문자열을 합치며, NULL 값을 자동으로 무시.

사용 예시를 대충 들어보자면,
NULL 처리가 필요한 경우 → COALESCE() 사용
구분자를 포함해서 데이터를 합치는 경우 → CONCAT_WS() 사용
숫자 데이터와 결합할 경우 → CAST() 또는 CONVERT() 사용

이렇게 정리해볼 수 있겠다.

#SQL #문제해결
1 개의 댓글
에루샤 certified 2일 전 대댓글
6년전 글이라 부족한게 있어서 내용 보완 좀 했습니다.
백엔드 콜렉션의 다른 글
×