MySQL에서 쉼표로 구분된 필드의 값 개수 세기
MySQL에서는 CHAR_LENGTH() 함수를 활용하면 쉼표로 구분된 필드에 저장된 값의 개수를 손쉽게 계산할 수 있습니다.
핵심 원리는 간단합니다. 전체 문자열 길이에서 쉼표를 제거한 문자열의 길이를 빼면 쉼표의 개수가 나오고, 여기에 1을 더하면 실제 값의 개수가 됩니다.
기본 문법
SELECT *,
(CHAR_LENGTH(yourColumnName) - CHAR_LENGTH(REPLACE(yourColumnName, ',', '')) + 1) AS anyVariableName
FROM yourTableName;
위 문법을 이해하기 위해 실제 예제를 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 테이블을 생성하는 쿼리입니다.
mysql> CREATE TABLE CountValuesCommaSeparated
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> CommaSeparatedValue text,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.76 sec)
2단계: 샘플 데이터 삽입
INSERT 명령어를 사용해 쉼표로 구분된 값을 가진 레코드를 여러 개 삽입합니다.
mysql> INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue)
VALUES('101,104,1900,46675,7895');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue)
VALUES('1010,18949,37465');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue)
VALUES('2010,1201,2743874,7485');
Query OK, 1 row affected (0.42 sec)
mysql> INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue)
VALUES('4757,457587,48586,378575,3874765,487565');
Query OK, 1 row affected (0.26 sec)
3단계: 전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> SELECT * FROM CountValuesCommaSeparated;
실행 결과는 다음과 같습니다.
+----+-----------------------------------------+
| Id | CommaSeparatedValue |
+----+-----------------------------------------+
| 1 | 101,104,1900,46675,7895 |
| 2 | 1010,18949,37465 |
| 3 | 2010,1201,2743874,7485 |
| 4 | 4757,457587,48586,378575,3874765,487565 |
+----+-----------------------------------------+
4 rows in set (0.00 sec)
4단계: 쉼표로 구분된 값 개수 계산
이제 CHAR_LENGTH()와 REPLACE() 함수를 조합하여 각 행에 포함된 값의 개수를 계산하는 쿼리를 실행합니다.
mysql> SELECT *,
-> (CHAR_LENGTH(CommaSeparatedValue) -
CHAR_LENGTH(REPLACE(CommaSeparatedValue, ',', '')) + 1) AS TotalValue
-> FROM CountValuesCommaSeparated;
실행 결과는 다음과 같습니다.
+----+-----------------------------------------+------------+
| Id | CommaSeparatedValue | TotalValue |
+----+-----------------------------------------+------------+
| 1 | 101,104,1900,46675,7895 | 5 |
| 2 | 1010,18949,37465 | 3 |
| 3 | 2010,1201,2743874,7485 | 4 |
| 4 | 4757,457587,48586,378575,3874765,487565 | 6 |
+----+-----------------------------------------+------------+
4 rows in set (0.00 sec)
동작 원리 정리
결과를 보면 각 행의 TotalValue 컬럼에 값의 개수가 정확히 계산된 것을 확인할 수 있습니다.
- CHAR_LENGTH(컬럼명): 원본 문자열의 전체 길이를 반환합니다.
- REPLACE(컬럼명, ',', ''): 문자열에서 모든 쉼표를 제거합니다.
- 두 길이의 차이가 곧 쉼표의 개수이며, 값의 개수는 항상 쉼표 개수보다 1 많으므로 +1을 해줍니다.
예를 들어 '101,104,1900,46675,7895'의 경우 쉼표가 4개이므로 값은 4 + 1 = 5개입니다.
참고: 이 방법은 필드가 비어 있거나 NULL인 경우에는 올바른 결과를 보장하지 않으므로, 실무에서는 WHERE 절로 빈 값을 제외하거나 COALESCE() 함수를 함께 사용하는 것이 좋습니다.