본문 바로가기
PS/SQL

[SQL] 조건에 맞는 사용자 정보 조회하기

by 행복한라이언 2024. 2. 12.
728x90
반응형

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/164670

 

프로그래머스

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

programmers.co.kr

1. 핵심

  • COUNT 집계함수 - group by된 행의 개수를 세고 싶을 때..순간 떠올리지 못했다.
  • CONCAT
    • CONCAT('행복한', '라이언')의 결과는 '행복한라이언'으로 띄어쓰기 없이 출력된다. 출력 양식을 잘 봐서 띄어쓰기에도 주의하도록한다.
  • SUBSTRING
    • 전화번호의 양식 'xxx-xxxx-xxxx'을 만들기 위해서 사용한 함수이다.
    • SUBSTRING(STR, start_position(인덱스0은 없으며 1부터 시작함), length(잘라낼 문자열의 길이, 없으면 시작부터 끝까지)
  • CHARINDEX
    • CHARINDEX( 찾고자하는 문자열, 검색 대상)
    • CHARINDEX('행복한 라이언', '라이언') -- 5
    • CHARINDEX는 발견되는 첫 번째 위치를 반환함!!
728x90

2. 코드(MySQL)

-- 코드를 입력하세요
# 게시글 3건 이상 등록한 사용자의 id, 닉네임, 전체주소, 전화번호
# 전체주소: 시/명/상세주소
# 전화번호 xxx-xxxx-xxx
# 회원id기준 내림차순
with temp as (
    select WRITER_ID, count(*) AS count
    from USED_GOODS_BOARD
    group by WRITER_ID
    having count >= 3
)

select U.USER_ID,
       U.NICKNAME,
       concat(U.CITY,
              ' ',
              U.STREET_ADDRESS1,
              ' ',
              U.STREET_ADDRESS2) as 전체주소,
       concat(substring(U.TLNO, 1, 3),
              '-',
              substring(U.TLNO, 4, 4),
              '-',
              substring(U.TLNO, 8)) as 전화번호
from temp T
inner join USED_GOODS_USER U on T.WRITER_ID = U.USER_ID
order by U.USER_ID desc;

 

3. 활용예제

1. 성과 이름 분할

SELECT 
    SUBSTRING(full_name, 1, CHARINDEX(' ', full_name) - 1) AS first_name,
    SUBSTRING(full_name, CHARINDEX(' ', full_name) + 1, LEN(full_name)) AS last_name
FROM 
    users;

 

2. 전화번호의 서식 변경

SELECT 
    CONCAT(
        SUBSTRING(phone_number, 1, 3),
        '-',
        SUBSTRING(phone_number, 4, 4),
        '-',
        SUBSTRING(phone_number, 8)
    ) AS formatted_phone_number
FROM 
    contacts;

 

3. 패턴일치

SELECT 
    SUBSTRING(url, CHARINDEX('//', url) + 2, LEN(url)) AS domain
FROM 
    websites;

# https://www.example.com
# www.example.com

# charindex 사용
SELECT CHARINDEX('world', 'Hello world'); -- 7

 

 

728x90
반응형