MySQL에서 문자열을 연결할 때 CONCAT() 함수와 CONCAT_WS() 함수는 NULL 값을 처리하는 방식에서 중요한 차이를 보입니다. CONCAT() 함수는 인수 중 하나라도 NULL이면 전체 결과가 NULL로 반환됩니다. 반면 CONCAT_WS() 함수는 첫 번째 인수인 구분자(separator)가 NULL일 때만 NULL을 반환하며, 나머지 인수에 포함된 NULL 값은 무시하고 정상적으로 연결을 진행합니다.
따라서 테이블의 여러 열 값을 연결하려는데 그중 일부 열에 NULL 값이 들어 있을 가능성이 있다면, CONCAT_WS() 함수가 CONCAT() 함수보다 훨씬 안전하고 실용적인 선택입니다. 이를 이해하기 위해 다음과 같은 데이터를 가진 'Student_Name' 테이블의 예를 살펴보겠습니다.
mysql> Select * from Student_Name; +---------+-------+---------+ | FName | Mname | Lname | +---------+-------+---------+ | Rahul | NULL | Singh | | Gaurav | Kumar | NULL | | Harshit | NULL | Khurana | | Yash | Pal | Sharma | +---------+-------+---------+ 4 rows in set (0.00 sec)
CONCAT() 함수 사용 시의 문제점
Fname, Mname, Lname 세 열의 값을 하나로 합친다고 가정해 보겠습니다. CONCAT() 함수를 사용하면 결과는 다음과 같습니다.
mysql> Select CONCAT(Fname,Mname,Lname)AS Name from Student_Name; +---------------+ | Name | +---------------+ | NULL | | NULL | | NULL | | YashPalSharma | +---------------+ 4 rows in set (0.00 sec)
위 결과에서 알 수 있듯이, Mname 또는 Lname 중 하나라도 NULL인 행은 이름의 나머지 부분이 존재함에도 불구하고 전체 결과가 NULL로 반환됩니다. 네 개의 행 중 세 개가 NULL이 되어버리는 것이죠. 이는 실무에서 매우 치명적인 문제로 이어질 수 있습니다.
CONCAT_WS() 함수로 해결하기
반면 CONCAT_WS() 함수를 사용하면 NULL 값을 자동으로 무시하고 나머지 값들만 연결합니다.
mysql> Select CONCAT_WS(' ',Fname,Mname,Lname)AS Name from student_name;
+-----------------+
| Name |
+-----------------+
| Rahul Singh |
| Gaurav Kumar |
| Harshit Khurana |
| Yash Pal Sharma |
+-----------------+
4 rows in set (0.00 sec)CONCAT_WS(' ', Fname, Mname, Lname)처럼 첫 번째 인수에 구분자(여기서는 공백 ' ')를 지정하면, NULL이 아닌 값들만 공백으로 구분되어 깔끔하게 연결됩니다. 덕분에 모든 행에서 의미 있는 완전한 이름이 출력되는 것을 확인할 수 있습니다.
정리하자면, 열 값 연결 시 NULL이 포함될 가능성이 조금이라도 있다면 CONCAT_WS() 함수를 사용하는 것이 좋습니다. 원치 않는 NULL 결과를 방지하고, 구분자를 활용해 가독성 높은 출력까지 얻을 수 있기 때문입니다.