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

MySQL에서 조건에 따라 동일한 열의 두 값을 연결하는 방법

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 문과 집계 함수를 조합하면 조건이 다른 동일한 열의 값들을 자유롭게 변환하고 연결할 수 있습니다.