[TIL] RLIKE, 뽑으면 안될 것을 뽑아버렸을 때

Hanna Kim·2020년 9월 22일
3

SQL

목록 보기
10/11

나라의 이름을 모아둔 테이블이 있다.

여기서 모음을 포함하는 나라 이름만 뽑아보자.

RLIKE "[aeiou]"

Korea, France, USA.. 등이 나온다.
참고로 RLIKE를 REGEXP로 대체해도 된다. (둘은 그냥 똑.같.다)

그렇다면 모음으로 시작하는 나라 이름만 뽑아보자.

RLIKE "^[aeiou].*"

USA, Australia, India...등이 나온다.

이때 만약 실수로 *를 빼먹었다면?

RLIKE "^[aeiou]."

추가적인 조건이 필요한 게 아니었다면 그래도 결과가 제대로 나온다.

의문이 생긴다. 정규표현식에서 .은 "any single character"를 의미한다. 한 글자를 나타낸다는 말이다.

그렇다면 위의 실수를 저질렀을 때 USA, Australia, India등 세 글자 이상인 문자열이 나오면 안되는 것 아닌가? 두 글자로 구성된 문자열만 나와야하지 않나?

뽑으면 안될 것 같은데 뽑아버렸다.


RLIKE의 정체

RLIKE를 종종 사용했으면서 RLIKE가 정확히 어떤 함수인지 파악하지 못했다. 위의 궁금증도 결국 RLIKE의 역할에 대해 제대로 알지 못했기 때문에 나온 것이다.

RLIKE의 핵심은 RLIKE '~'라고 했을 때 '~' 문자열을 포함한 모든 값을 골라낸다는 것이다.


간단하게 예를 들어서 "[aeiou]"라고 하면, 위치에 상관없이 모음이 한 개 들어가면 다 뽑아낸다.

따라서 더욱 유용하게 사용하기 위해서 자리를 명확하게 해줄 필요도 있는데, 이때 필요한 게 처음과 끝을 나타내는 ^나 $이다.


어쨌든 위의 "^[aeiou]." 도 살펴보면, 가장 앞에 모음이 오고 그 바로 뒤에 문자 하나가 오는 문자열을 포함하면 다 가져온다.

"ab", "abc", "abcd" 등 다 해당이 된다. 뽑으면 안될 것이 아니라, 뽑히는 게 맞다.

"a"처럼 한글자 모음으로 구성된 값 빼고는 다 가져오는 것이다. 이 경우는 모음으로 시작하긴 했으나 뒤에 문자가 안오니까 매치되지 않는다.

여기서 . 의 용도도 더 명확해졌는데, "^[aeiou].p"와 같이, 뭔지 모를 한 문자가 첫 글자인 모음과 세번째 글자인 p 사이에 있어야 한다를 나타날 때, 다시 말해 찾는 알파벳 중간에 뭐가 있어야 한다!! 를 나타낼 때 사용하는 것이다.

profile
쌓으며 배우는 중

0개의 댓글