데이터베이스에서 원시 데이터를 추출한 뒤, 다른 곳에서 사용할 수 있도록 형식을 바꿔야 할 때가 종종 있습니다. 이 글에서는 MySQL에서 쿼리 내 문자열을 다룰 때 유용하게 활용할 수 있는 몇 가지 함수를 소개합니다.
스키마 구성하기
이 섹션에서는 글에서 다룰 SQL 개념을 설명하기 위한 간단한 스키마를 준비합니다. 함수 설명에는 MySQL을 사용하며, 문법 연습과 쿼리 실행은 SQL Fiddle을 이용하는 것을 추천합니다. SQL Fiddle에서는 다른 관계형 데이터베이스에서도 쿼리를 테스트해 볼 수 있습니다.
테이블 생성 및 값 삽입
CREATE TABLE birthdays (
name varchar(200) NOT NULL,
birthday varchar(10) NOT NULL
);
INSERT INTO birthdays (name, birthday) VALUES("Jane", "11/20/1993");
INSERT INTO birthdays (name, birthday) VALUES("Duncan", "01/15/1987");
INSERT INTO birthdays (name, birthday) VALUES("Lucas", "07/21/1996");
INSERT INTO birthdays (name, birthday) VALUES("Alexa", "12/31/1988");
코드의 처음 네 줄은 "name"과 "birthday" 두 컬럼을 가진 "birthdays" 테이블을 생성하고, 나머지 줄은 데이터베이스에 값을 삽입합니다. 이후 쿼리문을 작성할 때 이 테이블을 사용합니다.
테이블에 기본적인 쿼리를 실행하면 쿼리문과 결과는 다음과 같습니다.
SELECT name, birthday FROM birthdays;
실행 결과:
| name | birthday |
| Jane | 11/20/1993 |
| Duncan | 01/15/1987 |
| Lucas | 07/21/1996 |
| Alexa | 12/31/1988 |
쿼리문 작성하기
CONCAT()
CONCAT() 함수는 전달받은 인자들을 하나의 문자열로 합친 결과를 반환합니다. 인자는 최소 한 개 이상 필요하며, 여러 개를 전달할 수도 있습니다. 함수의 인자로 사용될 수 있는 타입은 다음과 같습니다.
- 바이너리 문자열(Binary String) – 인자 중 하나라도 바이너리 문자열이면 반환값 역시 바이너리 문자열입니다.
- 논바이너리 문자열(Nonbinary String) – 일반적인 문자열 값입니다. 모든 인자가 논바이너리 문자열이면
CONCAT()은 논바이너리 문자열을 반환합니다. - 숫자(Numeric) – 숫자 타입의 입력값은 다른 인자와 결합되기 전에 자동으로 논바이너리 문자열로 변환됩니다.
- NULL – 인자 중 하나라도 NULL이면
CONCAT()은 NULL을 반환합니다. 참고로CONCAT_WS()는 NULL 값을 무시하고 나머지 문자열만 연결하므로, 두 함수의 NULL 처리 방식이 다르다는 점에 유의하세요.
공식 문법은 다음과 같습니다.
CONCAT(<문자열 값 1>, <문자열 값 2>, [... <문자열 값 N>]);
CONCAT 키워드 뒤에 괄호를 붙여 함수임을 나타내고, 괄호 안에는 연결할 N개의 입력 문자열을 넣습니다. MySQL에서의 사용 예시는 다음과 같습니다.
SELECT CONCAT(name, " ", birthday) AS Result FROM birthdays;
name, 공백 문자, birthday를 연결한 결과값을 SELECT하여 "Result"라는 별칭을 붙였습니다.
이 쿼리의 실행 결과는 다음과 같습니다.
| Result |
| Jane 11/20/1993 |
| Duncan 01/15/1987 |
| Lucas 07/21/1996 |
| Alexa 12/31/1988 |
이 결과를 앞서 스키마 구성 섹션에서 테스트했던 기본 쿼리 결과와 비교해 보세요. 어떤 점이 다른가요? 데이터를 이렇게 가공해서 제공하면 어떤 장점이 있을까요?
정답이 정해져 있는 질문은 아닙니다. 중요한 것은 애플리케이션에서 이 데이터를 어떻게 활용하느냐에 따라 최적의 방식이 달라진다는 점입니다.
CONCAT_WS()
CONCAT_WS() 함수는 CONCAT() 함수와 동일하게 동작하지만, 원래의 CONCAT()에는 없는 첫 번째 필수 인자가 추가로 필요합니다. 이 인자는 나머지 인자들 사이에 삽입될 구분자(separator)이며, 그 외의 규칙은 CONCAT()과 동일하게 적용됩니다.
공식 문법은 다음과 같습니다.
CONCAT_WS(<구분자>, <문자열 값 1>, <문자열 값 2>, [... <문자열 값 N>]);
CONCAT_WS 키워드 뒤에 괄호를 붙여 함수임을 나타냅니다. 괄호 안의 첫 번째 인자는 각 입력 문자열 사이에 들어갈 구분자이고, 나머지 인자들은 서로 연결할 문자열들입니다. MySQL에서의 사용 예시는 다음과 같습니다.
SELECT CONCAT_WS(", ", name, birthday) AS Result
FROM birthdays;
실행 결과는 각 인자 사이에 첫 번째 인자인 구분자가 삽입된 형태의 문자열 연결입니다.
| Result |
| Jane, 11/20/1993 |
| Duncan, 01/15/1987 |
| Lucas, 07/21/1996 |
| Alexa, 12/31/1988 |
CONCAT() 함수와 마찬가지로, CONCAT_WS() 함수 역시 Result라는 이름의 단일 컬럼을 반환하며, 값은 입력 문자열들이 구분자와 함께 연결된 형태입니다.
마무리
이 글에서는 MySQL에서 사용되는 SQL CONCAT()과 CONCAT_WS() 함수를 살펴보았습니다. 다른 관계형 데이터베이스를 사용할 때는 각 DBMS마다 고유한 SQL 방언이 있어 문법에 약간의 차이가 있을 수 있다는 점에 유의하세요. 함수의 표기나 세부 동작은 조금씩 다를 수 있지만, 문자열을 연결한다는 기본 개념은 동일합니다.