본문 바로가기

코딩 나도 할 수 있다!!

2024.03.19 (화) SQL CONCAT, CONCAT_WS 함수 (feat.SUBSTRING)

SQL 문제를 풀다 역시나 막힌 문제가 있었다

어지럽다...

하지만 풀어야 한다

전체 주소를 조회해야 하는데 주소들이 다 나눠져 있다

뭔지 잘 모르겠다

오늘도 역시나 검색!!

CONCAT 함수가 나온다

일단 적용

CONCAT(" ", U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2) AS "전체주소"

이렇게 적용해 보았다

앞에 시에서 띄어쓰기가 되어야 하는데 붙혀져서 나온다

이럴 땐 어떻게 해야 할까?

CONCAT_WS 란 함수가 있다

쓰으으읍.... 뭔지는 알 것 같은데 일단 적용해 본다

CONCAT_WS(' ', U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2) AS "전체주소"

잘 띄어졌다

이게 어떻게 되는 걸까?

찾아보니 

CONCAT_WS는 파라미터에 구분자(separator)를 추가하여 문자열 사이사이에 구분자를 넣어 붙여주는 기능을 합니다.

아하!! separator 자리에 띄어쓰기를 넣었더니 문자열 사이에 띄어쓰기가 들어가는 거구나

그렇다면 이건 어떨까?

전화번호는 또 어떻게 나올까?

이렇게 붙혀져서 나온다

여기서도 CONCAT_WS를 넣어보자

SELECT CONCAT_WS('-' TLNO)

이렇게 넣었더니

오류가 뜬다

왜 인지 곰곰이 생각해 봤다

전화번호는 한 묶음으로 되어있어 -이 들어갈 수 있게 사이를 나눠줘야 한다

그렇다면 문장 사이를 끊으려면 어떤 함수를 써야 할까?

정답은 SUBSTRING 함수다

이 함수에 대해 찾아보니

SUBSTRING( 문자열, 시작 위치, 길이 ) >> 문자열에서 시작 위치부터 길이만큼 출력합니다.

이렇게 설명한다

010 다음에 - 을 넣어주려면

CONCAT_WS('-', SUBSTR(TLNO, 1, 3)

이렇게 문자열 + 시작 지점 + 길이

즉 첫 번째부터 시작해 3칸 다음에 -이 들어가는 것이다

그렇다면 이 함수를 이용하여

CONCAT_WS('-', SUBSTR(TLNO, 1, 3), SUBSTR(TLNO, 4, 4), SUBSTR(TLNO, 8, 4))

이렇게 코드를 쓰면

이렇게 나눠진 사이에 - 이 들어가는 걸 볼 수 있다

모르는 것이 해결이 되었으니 코드를 써 내려가면 된다

SELECT U.USER_ID,
       U.NICKNAME,
       CONCAT_WS(" ", U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2) AS "전체주소",
       CONCAT_WS("-", SUBSTR(U.TLNO, 1, 3), SUBSTR(U.TLNO, 4, 4), SUBSTR(U.TLNO, 8, 4)) AS "전화번호" 
FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_USER AS U ON B.WRITER_ID = U.USER_ID
GROUP BY U.USER_ID
HAVING COUNT(U.USER_ID) => 3
ORDER BY U.USER_ID DESC

결과는?

오류가 뜬다

왜일까? 

그래서 물어보았다

HAVING COUNT(U.USER_ID) => 3

이 부분이 잘못되었다

등호 표시에서 => 이건  쓸 수 없다

그렇다면 >=이렇게 써 보았다

SELECT U.USER_ID,
       U.NICKNAME,
       CONCAT_WS(" ", U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2) AS "전체주소",
       CONCAT_WS("-", SUBSTR(U.TLNO, 1, 3), SUBSTR(U.TLNO, 4, 4), SUBSTR(U.TLNO, 8, 4)) AS "전화번호" 
FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_USER AS U ON B.WRITER_ID = U.USER_ID
GROUP BY U.USER_ID
HAVING COUNT(U.USER_ID) >= 3
ORDER BY U.USER_ID DESC

결과는?

정상적으로 잘 나오는 것을 볼 수 있다

왜 => 이렇게는 쓸 수 없는지는 추측으로는 등호 왼쪽에 부등호가 있어야 하는 것 같은데

이건 문법 공부를 하면서 더 알아가 보면 될 것 같다


오늘의 느낀점

비슷해 보이더라도 결과는 다를 수 있다