개발
백엔드
MySQL CONCAT 함수 및 NULL 처리 방법
⚠ 이 글은 2년 이상 지난 이야기에요. 읽으실때 참고!
쿼리 작업하다가 데이터 합칠게 있어서 CONCAT 썼다가 안되는 문제 발생해서 문제 해결 후 잊어버릴까봐 작업 로그겸 기록 남깁니다.
CONCAT
MySQL 또는 MariaDB에서 한 개 이상의 문자열 데이터를 합치는 DB함수로서 CONCAT을 지원합니다.
SELECT CONCAT('Hello', ' ', 'World');
# Result
Hello World
Copy
통상적으로는 두개의 유효한 문자열을 합치는데 큰 문제없이 사용할 수 있는 기능이긴한데, 합치는 값이 Null값을 가지고 있으면 결과값이 통째로 NULL이 나옵니다.
SELECT CONCAT('Hello', NULL, 'World');
# Result
NULL
Copy
COALESCE
그럴땐 NULL값을 판독해 공백문자로 치환할 수 있는 COALESCE 함수와 같이 사용하면 원하는 쿼리결과를 얻을 수 있습니다.
COALESCE 함수는 값이 NULL인 문자를 주어진 문자열로 치환하는 함수입니다.
SELECT CONCAT('Hello', COALESCE(NULL, ''), 'World');
# Result
HelloWorld
Copy
그래서 이렇게 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, Cherry
Copy
이 함수는 기존 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
개의 댓글
에루샤
2일 전
대댓글
6년전 글이라 부족한게 있어서 내용 보완 좀 했습니다.
백엔드 콜렉션의 다른 글
개발 카테고리의 다른 글
09/03/2019
MySQL GROUP_CONCAT 기능으로 쿼리 결과를 하나로 합치기
Mysql CONCAT 기능에 대해서 - eruLabo잊어버릴까봐 작업 로그겸 기록 남깁니다. MySQL 또는 MariaDB에서 한 개 이상의 문자열...
06/20/2019
Nginx 특정 IP 차단 하기
오랜만에 방문자 세션을 뒤지던 도중에 일반적인 사용자도 아닌 봇도 아닌 접근자가 이상한 경로를 요청한 로그를 발견했다. 남...
06/20/2019
Nginx 체인 인증서 적용
eruLabo의 SSL 인증서가 거의 만료때가 다가와서 2년 연장하면서 새로 인증작업을 다시하는 도중에 체인 인증서라는 것을 적용해...