개발
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
개의 댓글
에루샤
3달 전
대댓글
6년전 글이라 부족한게 있어서 내용 보완 좀 했습니다.
개발 카테고리의 다른 글
09/03/2019
MySQL GROUP_CONCAT 기능으로 쿼리 결과를 하나로 합치기
Mysql CONCAT 기능에 대해서 - eruLabo잊어버릴까봐 작업 로그겸 기록 남깁니다. MySQL 또는 MariaDB에서 한 개 이상의 문자열 데이터를 합치는 DB함수로서 CONCAT을 지원합니다.통상적으로는 두개의 유효한 문자열을 합치는데 큰 문제없이 사용할 수 있...https://erulabo.com/46 마찬가지로 이전글에 이어서 작업로그 남...
06/20/2019
Nginx 특정 IP 차단 하기
오랜만에 방문자 세션을 뒤지던 도중에 일반적인 사용자도 아닌 봇도 아닌 접근자가 이상한 경로를 요청한 로그를 발견했다. 남겨진 로그정보를 바탕으로 조금 검색해봤더니 관리자 권한이나 특정 엑세스를 노리는 해킹용 접근시도로 밝혀졌다. 보통 과도한 접근시도같은건 자동으로 막히는데 무슨 매크로 돌리는거처럼 발...
06/20/2019
Nginx 체인 인증서 적용
eruLabo의 SSL 인증서가 거의 만료때가 다가와서 2년 연장하면서 새로 인증작업을 다시하는 도중에 체인 인증서라는 것을 적용해보았습니다. 체인 인증서란 루트 인증서와 발급받은 인증서 간의 연결을 보장해주는 인증서로써 쉽게말해 각자 홈페이지에서 사용하고 있는 인증서가 어디의 인증서버에서 발급해준건지 중계 및...