[코드카타] SQL 126번

양승우·2024년 10월 31일

코드카타

목록 보기
27/58

문제 126.

Write a solution to find the users who have valid emails.
A valid e-mail has a prefix name and a domain where:
1) The prefix name is a string that may contain letters (upper or lower case), digits, underscore '_', period '.', and/or dash '-'. The prefix name must start with a letter.
2) The domain is '@leetcode.com'.

(링크)

데이터 이해 및 풀이 구상

valid email을 찾는 쿼리를 작성하시오

valid email이란 (1) prefix name이 대소문자, 숫자, _, ., -로만 이루어졌으며 문자(대소문자)로 시작하는 경우 & (2) 도메인이 @leetcode.com인 경우

'@'를 기준으로 앞뒤를 잘라서 위 조건을 적용하면 될 것이다.
다만 이런 문제는 높은 확률로 '@'를 2개 이상 포함한 데이터를 체크할 것이라는 점을 주의

필요한 함수는 2가지다.
1. 문자열을 split 하기 위한 함수
2. 문자열을 특정 조건으로 검색하기 위한 함수

1번은 SUBSTRING_INDEX로, 2번은 REGEXP(정규 표현식)로 할 수 있다.
(SUBSTRING_INDEX 참고) (정규표현식 참고)

코드

SELECT
    *
FROM
    users
WHERE
    (SUBSTRING_INDEX(mail, '@', -1) = 'leetcode.com')
    AND (SUBSTRING_INDEX(mail, '@leetcode.com', 1) REGEXP ('^[A-Za-z]([A-Za-z0-9_.-]*)$'))
;

조건문은 2가지로 입력했다.

조건문 1번

SUBSTRING_INDEX(mail, '@', -1) = 'leetcode.com'

SUBSTRING_INDEX를 통해서 mail 컬럼에서 '@'를 기준으로 뒤에서 1번째 (즉 마지막)을 추출하고, 이것이 'leetcode.com'인 경우

조건문 2번

SUBSTRING_INDEX(mail, '@leetcode.com', 1) REGEXP ('^[A-Za-z]([A-Za-z0-9_.-]*)$')

마찬가지로 SUBSTRING_INDEX를 활용했는데, 이번에는 '@'가 아니라 '@leetcode.com' 전체를 구분자로 설정했다.

실제로 케이스 하나에서 'Naftali@JQQPcQcHLG@leetcode.com'라는 데이터를 통해 '@'를 2개 입력하고 있기에, '@'만 지정한다면 'Naftali@JQQPcQcHLG'에 '@'가 포함되어 있음에도 valid로 판단할 수 있다.

어차피 2번 조건에서 필요한 것은 '@leetcode.com' 앞의 부분 전체이므로, 아예 구분자를 이렇게 설정하면 필요한 부분만 추출할 수 있다.

정규 표현식은 '^[A-Za-z]([A-Za-z0-9_.-]*)$'로 입력했다.
앞에서부터 설명하자면,
^[A-Za-z]은 '알파벳 대문자 혹은 소문자'로 시작한다는 의미이며,
([A-Za-z0-9_.-]*)$는 '알파벳 대문자 소문자 숫자 _ . -'가 0~n회 나타나며, 그 문자열이 전체의 끝이라는 의미이다.

profile
어제보다 오늘 더

0개의 댓글