본문 바로가기
SQL/코딩테스트

[MySQL] SUBSTR/REGEXP/LEFT/RIGHT 문자열 다루기

by Nanki 2024. 11. 8.

문제 출처 :  https://www.hackerrank.com/challenges/weather-observation-station-11/problem

 

Weather Observation Station 11 | HackerRank

Query a list of CITY names not starting or ending with vowels.

www.hackerrank.com

 

풀이 매크로

1. 문제 정의 별도로 필요하지 않음

2. 요구사항 정리 

 - City의 첫글자나 마지막 글자에 알파벳 자음이 들어가선 안됨

 - 결과 City값이 중복되선 안됨

 

코드 작성

SELECT DISTINCT city
FROM STATION
WHERE (LOWER(SUBSTR(city,1,1)) NOT IN ('a','i','e','o','u'))
    OR (LOWER(SUBSTR(city,-1)) NOT IN ('a','i','e','o','u'))

 

SUBSTR(City,1,1)은 첫 글자를 의미하며 LEFT(city,1)와 결과가 동일하므로 이 코드에서도 대체해서 사용할 수 있다.

SUBSTR( City,-1은 마지막 글자를 의미하며 RIGHT(city,1)와 결과가 동일하므로 이 코드에서도 대체해서 사용할 수 있다.

 

다른 풀이

SELECT DISTINCT city
FROM STATION
WHERE (LOWER(SUBSTR(city,1,1)) NOT REGEXP('a|i|e|o|u'))
    OR (LOWER(SUBSTR(city,-1)) NOT REGEXP('a|i|e|o|u'))

 

IN을 안쓰고 REGEXP를 이용해도 같은 결과가 나온다.

 

새로 배운 내용

1. WHERE 문에는 AS문으로 새로 만든 변수 사용불가함
2. WHERE문에 (조건식1,조건식2) NOT IN (알파벳) 이형태는 먹히지 않음. 
3. Like 문을 쓰려면 변수명 LIKE 'a%' OR 변수명 LIKE 'i%'... 이렇게 다 써줘야 함

4. 끝 글자와 마지막 글자를 가져올때 각각 LEFT함수와 RIGHT함수를 써도 됨

5. IN 대신에 REGEXP로 대체가 가능함

6. MYSQL은 다른 SQL과 특이하게 대/소문자 구별없이 문자열 특정이 가능하다(LOWER 함수를 위에서 제거해도 정답이된다.)