본문 바로가기

Code Kata/[SQL] Code Kata

[SQL] 프로그래머스 Lv.3 조건에 맞는 사용자 정보 조회하기

55. USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

 

MySQL의 경우 CONCAT이나 CONCAT_WS 함수를 사용하여 간단하게 여러 문자열을 합칠 수 있다.

  • CONCAT(column1, ' ', column2, ' ', column3) : 문자열마다 구분자 지정하여 연결
  • CONCAT_WS(' ', column1 ,column2, column3) : 특정 구분자 지정하여 문자열 연결

문자열 일부 추출시에는 LEFT, RIGHT, SUBSTR과 같은 함수를 사용할 수 있다.

  • LEFT(column, 글자 수) : 문자열 왼쪽부터 지정된 길이만큼 출력
  • RIGHT(column, 글자 수) : 문자열 오른쪽부터 지정된 길이만큼 출력
  • SUBSTR(column, 시작 위치, 글자 수) : 지정한 시작 위치부터 지정한 길이만큼 출력
--MySQL

SELECT u.user_id, u.nickname,
       CONCAT_WS(' ', u.city, u.street_address1, u.street_address2) "전체주소",
       CONCAT(LEFT(TLNO,3), '-', SUBSTR(TLNO,4, 4), '-',RIGHT(TLNO,4)) "전화번호"
FROM used_goods_board b JOIN used_goods_user u ON b.writer_id=u.user_id
GROUP BY 1
HAVING COUNT(u.user_id)>=3
ORDER BY 1 DESC

 

Oracle에서 CONCAT 함수는 두 개의 문자열만 지원하므로 3개 이상의 문자열을 합칠때는 함수를 중복하여 사용해야 한다. 함수를 중복하면 문자열이 많아질수록 복잡해지므로 || 연산자를 사용하여 간단하게 표현 가능하다.

또한 LEFT나 RIGHT 함수가 제공되지 않으므로 SUBSTR을 사용해야한다.

--Oracle

SELECT DISTINCT u.user_id, u.nickname,
       u.city||' '||u.street_address1||' '||u.street_address2 "전체주소",
       SUBSTR(TLNO, 1, 3)||'-'||SUBSTR(TLNO,4, 4)||'-'||SUBSTR(TLNO, 8, 4)"전화번호"
FROM used_goods_board b JOIN used_goods_user u ON b.writer_id=u.user_id
WHERE u.user_id IN (SELECT writer_id FROM used_goods_board 
                    GROUP BY writer_id HAVING COUNT(writer_id)>=3)
ORDER BY user_id DESC;

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr