MySQL에서 CONCAT_WS()로 조건에 맞는 행을 선택하며 문자열 연결하기
MySQL에서 여러 열(column)의 값을 하나의 문자열로 합치면서, 동시에 특정 조건에 맞는 행만 조회하고 싶다면 CONCAT_WS() 함수를 사용하면 됩니다. CONCAT_WS는 'Concatenate With Separator'의 약자로, 첫 번째 인자로 지정한 구분자를 기준으로 나머지 문자열들을 연결해 주는 함수입니다.
실제 동작 과정을 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 사용자 정보를 저장할 테이블을 생성합니다.
mysql> create table demo38 −> ( −> user_id int, −> user_first_name varchar(20), −> user_last_name varchar(20), −> user_date_of_birth date −> ); Query OK, 0 rows affected (1.70 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 이용해 테이블에 레코드를 추가합니다.
mysql> insert into demo38 values(10,'John','Smith','1990−10−01'); Query OK, 1 row affected (0.14 sec) mysql> insert into demo38 values(11,'David','Miller','1994−01−21'); Query OK, 1 row affected (0.13 sec) mysql> insert into demo38 values(11,'John','Doe','1992−02−01'); Query OK, 1 row affected (0.13 sec) mysql> insert into demo38 values(12,'Adam','Smith','1996−11−11'); Query OK, 1 row affected (0.11 sec) mysql> insert into demo38 values(13,'Chris','Brown','1997−03−10'); Query OK, 1 row affected (0.13 sec)
3. 테이블 데이터 확인하기
SELECT 문으로 테이블에 저장된 전체 레코드를 조회합니다.
mysql> select *from demo38;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+---------+-----------------+----------------+--------------------+ | user_id | user_first_name | user_last_name | user_date_of_birth | +---------+-----------------+----------------+--------------------+ | 10 | John | Smith | 1990−10−01 | | 11 | David | Miller | 1994−01−21 | | 11 | John | Doe | 1992−02−01 | | 12 | Adam | Smith | 1996−11−11 | | 13 | Chris | Brown | 1997−03−10 | +---------+-----------------+----------------+--------------------+ 5 rows in set (0.00 sec)
4. CONCAT_WS()와 WHERE 조건 함께 사용하기
이제 CONCAT_WS() 함수를 사용해 이름, 성, 출생 연도를 '/' 구분자로 연결하되, WHERE 절의 IN 조건으로 user_id가 11 또는 13인 행만 선택해 보겠습니다.
mysql> select concat_ws('/',user_first_name, user_last_name,'the date of birth year is=', date_format(user_date_of_birth,'%Y')) as Output
−> from demo38
−> where user_id in(11,13);
실행 결과는 다음과 같습니다.
+----------------------------------------------+ | Output | +----------------------------------------------+ | David/Miller/the date of birth year is=/1994 | | John/Doe/the date of birth year is=/1992 | | Chris/Brown/the date of birth year is=/1997 | +----------------------------------------------+ 3 rows in set (0.00 sec)
쿼리 핵심 요소 정리
- CONCAT_WS('/', ...) : 각 값을 '/'로 구분하여 하나의 문자열로 연결합니다.
- date_format(user_date_of_birth, '%Y') : DATE 타입의 생년월일 값에서 연도(YYYY) 부분만 추출합니다.
- where user_id in(11, 13) : user_id가 11 또는 13인 행만 필터링합니다. 그 결과 David Miller(1994년생), John Doe(1992년생), Chris Brown(1997년생) 세 개의 행이 반환됩니다.
참고: CONCAT_WS()는 모든 인자 사이에 구분자를 삽입하기 때문에, 마지막 값 앞에도 '/'가 붙어 'the date of birth year is=/1994'처럼 출력됩니다. 구분자 없이 자연스럽게 표현하고 싶다면 해당 리터럴 문자열을 별도로 처리하거나 CONCAT() 등 다른 방식을 고려해야 합니다.
이처럼 CONCAT_WS()와 WHERE 절을 함께 활용하면 문자열을 깔끔하게 연결하는 동시에, 원하는 조건에 맞는 데이터만 효율적으로 조회할 수 있습니다.