본문 바로가기

별걸다하는 IT/데이터베이스 Database

[DB SQL] 문자열 붙이기, 문자열 합치기 - CONCAT 함수와 || 연산자 사용하기 (MySQL과 ORACLE의 차이)

반응형

[데이터베이스 DBMS SQL 완전정복 포스팅 목차]

안녕하세요~~ 오늘도 SQL구문 하나를 들고 왔습니다.

꼭 알아야 할 필수 구문 중 하나이죠!ㅎㅎ

EMPLOYEES.csv
0.01MB / 0.01MB

데이터는 이전에 같이 다운로드 받았던 EMPLOYEES 테이블을 예시로 사용하였습니다.

 

CONCAT 함수란? CONCAT 문법

CONCAT은 CONCATENATION의 약자입니다. concatenation 단어 자체가 '문자열의 연결'이라는 뜻이랍니다.ㅎㅎ

넹. 문자열을 연결하고 싶을 때 CONCAT을 사용합니다.

concat 사용법

문자열1과 문자열2를 연결하고 싶을 때에는 CONCAT(문자열1, 문자열2)를 해주면 됩니다.

 

SIMPLE TEST

SELECT CONCAT('양햄찌 ', '블로그!') 문자열결과
FROM  DUAL;

"양햄찌 " + "블로그!" = "양햄찌 블로그!" 이렇게 되겠죠?ㅎㅎ

DBeaver 오라클 실행창

결과가 잘 뽑힌 것을 확인할 수 있습니다.

문자열을 이어 붙이고 싶을 때 CONCAT 함수 사용하자 

데이터베이스의 가장 기본 원칙 중 하나는 컬럼당 하나의 특성만 저장해야 한다는 겁니다.

그래서 여러 값을 하나의 속성에 때려넣지 않아요. 그런데!! 사용자 입장에서는 이러한 값들을 연결해서 확인하고 싶을 상황이 많죠.

 

한 예로 EMPLOYEES 테이블에 '성'과 '이름'이 각각 다른 컬럼에 저장되어 있어요. 

하지만 어떤 사람이 '뽀로로'라는 사람이 혹시 이 회사에서 근무하나요? 라고 물어볼 수 있겠죠!

그럼 우리는 성+이름 합친 값을 기준으로 데이터를 찾아야해요. 

 

그래서 요렇게 성과 이름을 붙여줬어요.

흠 잘 뽑히긴 하는데 FIRST_NAME과 LAST_NAME 사이에 띄어쓰기가 없으니까 어디까지가 성이고 어디까지가 이름인지 헷갈리는군요!

여러 개의 문자열을 한꺼번에 붙이려면? 중첩 CONCAT?

SELECT CONCAT(FIRST_NAME, ' ', LAST_NAME) 이름, 
		PHONE_NUMBER 전화번호
FROM EMPLOYEES ;

사이에 띄어쓰기를 넣어주고 싶어서 요렇게 작성해봤습니다. 

앗..! 그랬더니 '인수의 개수가 부적합합니다' 에러가 남을 확인할 수 있어요. [ORACLE 사용]

 

하이디 MYSQL 실행창

그런데 MYSQL에서는 또 정상적으로 실행이 돼요.

 

왜 그러냐!

SQL Server, MySQL, 오라클, PostgreSQL 등등 모두 CONCAT함수를 지원하는데, 어떤 DBMS냐에 따라서 매개변수를 두 개만 받기도 하고 여러개를 허용해주기도 하고 다르답니다. 오라클은 매개변수를 두 개만 받기 때문에 여러 문자를 연결하려면 중첩해서 CONCAT을 사용해줘야 합니다. 

 

SELECT CONCAT(CONCAT(FIRST_NAME, ' '), LAST_NAME) 이름, 
		PHONE_NUMBER 전화번호
FROM EMPLOYEES ;

요렇게!! 붙여야할게 많아지면 좀 수식이 복잡해지겠죠;

띄어쓰기가 잘 되었습니다.

 

오라클에서 문자열을 이어주는 ||연산자?  MYSQL에서는 참을 판별!

[ORACLE]

문자열을 연결시켜주는 도구로는 또 '||'연산자가 있습니다

CONCAT같은 경우 직관적이지도 않고 저렇게 중첩되면 작성하는 사람도 헷갈려서 실무에서는 ||를 더 자주 써요.

SELECT FIRST_NAME || ' ' || LAST_NAME 이름, 
		PHONE_NUMBER 전화번호
FROM EMPLOYEES ;

게다가 짧고, 간단하고, 포맷이 동일해서 더 간편하게 느껴집니다.

마찬가지로 FIRST_NAME과 LAST_NAME 사이에 띄어쓰기가 잘 들어간 것을 확인할 수 있어요.

 

[MYSQL]

이를 동일하게 MYSQL로 실행해봤습니다.

그런데 이를 MYSQL에서 수행하면 결과가 다르게 나옵니다. 

왜냐 오라클에서 ||와 MYSQL에서 || 연산자가 지원하는게 각기 다르기 때문인데요.

 

오라클에서 ||가 문자열 이어붙이기였다면 MYSQL에서는 우리가 아는 논리연산자 OR를 의미하기 때문입니다.

'A || B' 하면 A나 B 둘 중 하나가 참이면 모두 참 이라는 의미를 가진 연산자가 됩니다.

 

만약 이어붙이려는 타입이 문자열이 아니면 어떻게 될까?

문자열끼리 이어붙이면 된다는건 알겠는데 문자열이 아닌 데이터 유형일 경우 CONCAT를 사용할 수 있을까요?

 

테이블을 보시면 emp_no가 int 타입으로, gender은 ENUM 타입으로 되어있는 것을 알 수 있습니다. 

 

이 둘의 타입을 문자열과 같이 이어붙여봤어요. 잘 이어진 것을 확인할 수 있습니다.

 

[NULL테스트]

SELECT CONCAT(CONCAT(1234, NULL),'hello') 문자열결과
FROM  DUAL;

이번에는 NULL을 넣어서 테스트 해볼까요?

왼: MYSQL 오: 오라클

MYSQL에서는 CONCAT에 NULL이 포함되어 있으면 결과로 NULL을 리턴합니다. 

반면에 오라클의 경우 NULL을 빈 문자열로 간주하고 이어붙인 결과를 리턴하는 것을 확인할 수 있어요.

 

 오라클에서 CONCAT 함수는 모든 인수를 묵시적으로 문자열 형식으로 변환시킨 다음에 연결이 됩니다. 따라서 NULL인 데이터도 빈 문자열로 변환되어서 연결이 돼요. ||연산자도 마찬가지예요. 그런데 MYSQL에서는 NULL은 빈 문자열로 변환시키지 않고 NULL이 포함되었을 경우 결과를 NLL로 리턴한다는 것을 알 수 있습니다.

 

SELECT CONCAT(1234, IFNULL(NULL, ''),'hello') 문자열결과
FROM  DUAL;

MYSQL에서 NULL때메 결과가 제대로 리턴되는 것을 방지하고 싶으면 ISNULL이라는 함수를 사용해서 NULL일 경우 빈문자열로 치환하도록 직접 변환해주면 됩니다!

 

오늘은 간단하게 오라클과 MYSQL에서 문자열을 합치는 방법에 대해 알아봤어요

비슷한듯 DBMS마다 차이점이 있긴 있죠?ㅎㅎ 도움이 되셨다면 공감! 감사드립니다. 다음 포스팅에서 또 찾아뵐게요~~

반응형
  • 꼬마개발자푸푸 2021.05.08 13:44

    만약 위 테이블의 "이름" 칼럼의 값들을 하나의 문자열로 리턴 받으려면 어떻게 해야 하나요?

    원하는 출력 :

    "Steven King, Neena Kochlhar, Lex De Haan, .... , ( 칼럼명이 "이름"인 모든 row의 값들만 하나의 문자열로 이어서 반환)"