1 분 소요

key word : mysql, with recursive, with, cte



HackerRank에서 문제를 풀다가 찾게 된 함수들이다. LIKE 'a%' or LIKE 'e%'... 이렇게 하나 하나 쓰다보니 분명 한 번에 처리할 수 있는 방법이 있을 것 같아 찾아보게 됐다. 해당 문제의 토론 게시판을 참고하였고 기본적으로 MySQL을 기준으로 정리한다.



LIKE + 정규표현식

LIKE구문에 정규표현식을 함께 사용하는 경우이다.

SELECT DISTINCT CITY
FROM STATION
WHERE CITY LIKE '[AEIOU]%';

하지만 안타깝게도 MySQL이나 ORACLE같은 다른 DB에선 사용할 수 없고, MS SQL Server에서만 잘 동작한다.



RLIKE, REGEXP

두 구문은 동의어로 사용할 수 있다. LIKE와 사용법은 같지만 비교구문의 표기법이 정규식으로 들어간다는 차이점이 있다.

아래 두 구문은 같은 결과를 반환한다.

SELECT DISTINCT CITY
FROM STATION
WHERE CITY RLIKE '^[AEIOU].*?';
SELECT DISTINCT CITY
FROM STATION
WHERE CITY REGEXP '^[AEIOU].*?';



REGEXP_LIKE

RLIKE, REGEXP와 사용법이 비슷하지만 REGEXP_LIKE는 인자로 컬럼명과 표현식을 받는 함수이다.

SELECT DISTINCT CITY
FROM STATION
WHERE REGEXP_LIKE(CITY, '^[AEIOU].*?');



SUBSTR + IN

SUBSTR은 문자열, 시작 위치, 가져올 길이를 인자로 받는 함수이다.

  1. SUBSTR(str, start)
  2. SUBSTR(str FROM start)
  3. SUBSTR(str, start, length)
  4. SUBSTR(str FROM start FOR length) 다양한 방식으로 사용할 수 있다.

SUBSTR을 이용해 첫 번째 문자를 구하고, IN을 이용해 모음에 해당하는지 확인하는 방식으로 문제에 적용할 수 있다.

SUBSTR 대신 SUBSTRING, MID 등을 사용할 수 있다. 맨 첫글자 혹은 맨 뒷글자를 가져오는 것이라면 LEFT(문자, 가져올 개수), RIGHT(문자, 가져올 개수) 등을 사용할 수도 있다.

SELECT DISTINCT CITY
FROM STATION
WHERE SUBSTR(CITY, 1, 1) IN ('A', 'E', 'I', 'O', 'U');

업데이트: