Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

열 값 연결 시 NULL이 포함되었다면? CONCAT_WS() 함수가 CONCAT() 함수보다 유리한 이유

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 결과를 방지하고, 구분자를 활용해 가독성 높은 출력까지 얻을 수 있기 때문입니다.