MySQL에서 하나의 열에 저장된 여러 값을 서로 다른 조건에 따라 구분한 뒤, 이를 하나의 문자열로 연결해야 하는 경우가 있습니다. 이럴 때 CASE 문과 MAX(), CONCAT() 함수를 함께 활용하면 손쉽게 해결할 수 있습니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1869 ( Id int, Subject varchar(20), Name varchar(20) ); Query OK, 0 rows affected (0.00 sec)
샘플 데이터 삽입
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1869 values(100,'MySQL','John'); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1869 values(100,'MongoDB','Smith'); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1869 values(101,'MySQL','Chris'); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1869 values(101,'MongoDB','Brown'); Query OK, 1 row affected (0.00 sec)
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select * from DemoTable1869;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------+---------+-------+ | Id | Subject | Name | +------+---------+-------+ | 100 | MySQL | John | | 100 | MongoDB | Smith | | 101 | MySQL | Chris | | 101 | MongoDB | Brown | +------+---------+-------+ 4 rows in set (0.00 sec)
조건에 따라 두 값을 연결하는 쿼리
이제 Subject 열의 값이 'MySQL'인 행과 'MongoDB'인 행을 각각 다른 별칭으로 분리한 후, 이를 CONCAT()으로 연결하는 쿼리입니다.
mysql> select Id,concat(StudentFirstName,'',StudentLastName) from ( select Id, max(case when Subject='MySQL' then Name end) as StudentFirstName, max(case when Subject='MongoDB' then Name end) as StudentLastName from DemoTable1869 group by Id )tbl;
쿼리 동작 원리
내부 쿼리에서는 CASE WHEN을 사용하여 Subject가 'MySQL'일 때의 Name 값은 StudentFirstName으로, 'MongoDB'일 때의 Name 값은 StudentLastName으로 각각 매핑합니다. 이때 Id를 기준으로 GROUP BY 하기 때문에 한 명의 학생당 두 개의 과목 정보가 한 행으로 정렬됩니다. 조건에 맞지 않는 값은 NULL이 되며, MAX() 함수는 NULL을 무시하고 실제 존재하는 값을 반환하므로 피벗 테이블처럼 동작하게 됩니다. 마지막으로 외부 쿼리에서 CONCAT()으로 두 값을 하나로 합칩니다.
위 쿼리는 다음과 같은 결과를 출력합니다.
+------+---------------------------------------------+ | Id | concat(StudentFirstName,'',StudentLastName) | +------+---------------------------------------------+ | 100 | JohnSmith | | 101 | ChrisBrown | +------+---------------------------------------------+ 2 rows in set (0.00 sec)
결과를 보면 Id 100의 'John'과 'Smith'가 JohnSmith로, Id 101의 'Chris'와 'Brown'이 ChrisBrown으로 성공적으로 연결된 것을 확인할 수 있습니다. 이처럼 CASE 문과 집계 함수를 조합하면 조건이 다른 동일한 열의 값들을 자유롭게 변환하고 연결할 수 있습니다.