오늘 배워볼 함수는 mysql의 concat 함수입니다. 제가 SQL을 연습하는 사이트 중에는 해커랭크라는 사이트가 있는데요. 결과값 2개를 각각 res1, res2라고 하면, res1와 res2를 공백을 구분자로 해서, 1줄에 출력하라는 쿼리를 작성하는 문제가 있었습니다.

 

 결과값을 Char형이나 Varchar와 같은 것으로 Convert를 하고, 이어 붙이면 되지 않을까? 라는 생각을 하게 되었고, 그 기능을 쿼리에 담아내기 위해 필요한 것이 concat였습니다.

 

 

concat(var1,...)

 

 

 사용법은 위와 같습니다. 가변 인자를 받습니다. 이어버릴 문자열들을 콤마를 구분자로 해서 이어버리면 됩니다.

 

 


 예제를 몇 개 봅시다.

 

 

 먼저 'A'와 ' '와 'B'가 ,를 구분자로 이어져 있습니다. 이들을 concat의 매개 변수로 주었는데요. 실행 결과는 어떻게 나올까요? 'A'라는 문자열 다음에 ' '가 붙여지고, 그 다음에 'B'가 붙여질 거에요. 최종 결과는 'A B'가 될 거에요.

 

 

 여기까지는 그리 어렵지 않아요. 그런데, 이런 경우는 또 어떨까요? 숫자 1 뒤에 ' '를 연결한다. 그렇게 할 수도 있을 거에요. 그러면 어떻게 나올까요?

 

 


 숫자가 들어온 경우, binary string으로 변환을 시킵니다. 예제 2번부터 3번까지는, 쿼리의 결과도 보고, 결과값을 Hex값으로 볼 거에요. 어떤 식으로 리턴이 되었는지 말입니다.

 

 

 1과 ' '와 2와 ' '와 3과 ' '와 'ab'를 이어 붙였습니다. 그러면 결과는 아래와 같이 나올 겁니다.

 

 

 '1 2 3 ab' 이렇게요. 이게 어떻게 변환되었는지 Binary를 보겠습니다.

 

 

 그러면 31 20 32 20, ... 이런 식으로 저장이 되었다는 것을 볼 수 있는데요. 아스키 코드값 0x20은 space를, 0x30은 '0'을, 0x31은 '1'을 의미합니다. 숫자 1이 문자열로 잘 convert 되어서 들어갔음을 알 수 있어요.

 

 

 이 쿼리의 실행 결과는 어떻게 나올까요? 15 뒤에 ' ', ' ' 다음에 2가 붙고 ' '가 붙고 3이 붙고, ' '가 붙고, 그 다음에 'ab'가 붙입니다. 그러면 '15 2 3 ab'가 결과로 나올 거에요.

 

 

 이 결과를 Binary로 봅시다.

 

 

 그러면 15가 각각 0x31, 0x35로 바뀌었음을 알 수 있어요. 수가 문자열로 바뀐 셈입니다. Integer를 문자열로 convert를 할 때 concat을 이용할 수도 있을 듯 싶습니다.

 

 


 그러면 중간에 NULL값이 들어가는 경우는 어떨까요?

 

 

 이 쿼리의 실행 결과를 예상해 봅시다. NULL은 모르는 값입니다. 'a'가 될 수도 있고, 'b'가 될 수도 있고, 'cho'가 될 수도 있습니다. 그러면 'a'에다가 모르는 값을 뒤에 붙이고, 'b'를 뒤에 붙이면 어떻게 되나요? 모르는 값을 뒤에 붙였기 때문에, 알 수 없는 값이 나옵니다.

 

 

 따라서, 결과값은 NULL입니다. 이 점은 주의해야 합니다.