# concat, concat_ws

sql 코드카타를 풀던 중 출력하는 내용을 조작하는 문제를 받았다.

주소와 전화번호가 아래와 같이 주어질 경우 (from shipment_table)

- city : 성남시

- address1 : 분당구 수내로 13

- address2 : A동 1107호

- tlno : 01053422914

전화번호는 하이픈(-)을 넣고 주소는 city, address1, address2를 합쳐 전체 주소를 출력하라고 한다.

이때 concat을 사용해 문자열을 결합할 수 있지만 뒤에 _ws를 붙여 concat_ws를 사용하면 좀 더 간단하게 쿼리문을 작성할 수 있다.

### concat

주어진 여러 문자열을 단순히 결합한다. 

```
select concat(city, address1, address2) as full_address
       concat(substr(1,3), '-', substr(4,4), '-', substr(8,4))
        as tlno
from shipment_table
```

substr은 문자의 일부를 추출하는 함수다. 전화번호를 보기 편하게 010 5342 2914로 보여주기위해 3,4,4, 단위로 추출하고 중간에 하이픈(-)을 넣어 concnat으로 결한한다.

```
#출력문
  full_address: 성남시분당구 수내로 13A동 1107호
  tlno: 010-5342-2914
```

사실 이렇게만 작성해도 문제가 되지 않지만 주소를 보면 띄어쓰기가 불편하다.
concat_ws를 사용하면 보기에도 편하고 쿼리문도 좀 더 간편하게 작성할 수 있다.

### concat_ws

뒤에 붙은 ws는 with separator의 약자로 첫번째 인수를 구분자로 사용해 나머지 인수들을 결합한다. 그리고 구분자를 각 문자열 사이에 삽입한다.

```
select concat_ws(' ', city, address1, address2) as full_address
       concat_ws('-', substr(1,3) , substr(4,4), substr(8,4))
        as tlno
from shipment_table
```

전체주소를 출력하기 위해 concat_ws를 사용하고 첫번째 인자로 white space를 넣어서 띄어쓰기를 만들어준다. 그리고 전화번호에선 3,4,4 단위마다 하이픈(-)을 넣는 대신 맨 앞에 구분자로 하이픈(-)을 넣어 간결하게 작성해줬다.

```
#출력문
  full_address: 성남시 분당구 수내로 13 A동 1107호
  tlno: 010-5342-2914
```

주소의 경우 각 인자마다 띄어쓰기가 들어가 한눈에 보기 편하다.
concat으로 처리해야하는 쿼리문이 길다면 concat_ws를 사용해 간결하게 작성해보자.

For the site tree, see the [root Markdown](https://slashpage.com/kyugntae-ai.md).
