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
'Code Kata > [SQL] Code Kata' 카테고리의 다른 글
[SQL] 프로그래머스 Lv.4 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (1) | 2024.03.19 |
---|---|
[SQL] 프로그래머스 Lv.4 입양 시각 구하기(2) (1) | 2024.02.20 |
[SQL] 프로그래머스 Lv.3 오랜 기간 보호한 동물(1) (0) | 2024.01.18 |
[SQL] 프로그래머스 Lv.2 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.01.10 |
[SQL] 프로그래머스 Lv.2 입양 시각 구하기(1) (0) | 2024.01.10 |