Home » SQL » BASIC » sql like 연산자와 escape 하는 방법도 알아봅시다.

sql like 연산자와 escape 하는 방법도 알아봅시다.

sql에는 like 연산자가 있습니다. 문자열이 패턴을 만족하는지 알아보기 위해 쓰이는데요. 조금 더 고급 기능을 원하는 경우 similar to, 혹은 regex를 이용합니다.


먼저 %는 길이가 0 이상인 문자열과 match 됩니다. 그리고, _은 정확히 하나의 글자와 매치 됩니다. 예제를 몇 개 보면서 이해해 봅시다.

먼저 ‘abc’가 ‘a%’ 패턴에 걸리는지 물어보았습니다. ‘abc’는 ‘a’로 시작했습니다. 따라서 뒤에 따라오는 ‘bc’가 ‘%’에 매치 되는지 보면 됩니다. ‘bc’는 길이가 0 이상인 문자열이네요? 따라서, like 연산자는 true를 돌려줍니다.

이제 ‘bbc’가 패턴 ‘a%’와 매치 되는지 보겠습니다. 일단 첫 번째 글자가 ‘a’인가요? 아닙니다. ‘b’입니다. 따라서, like 연산자는 false를 돌려줍니다. 다시 말해, like ‘a%’는 접두사가 ‘a’인지를 검사합니다.

이제, ‘abc’가 ‘%c’에 매치 되는지 보겠습니다. 앞에 ‘%’는 임의의 문자열입니다. 그리고 맨 뒤에 ‘c’가 있습니다. 문자열 ‘abc’의 마지막 글자가 ‘c’인가요? 그렇습니다. 따라서, ‘ab’가 ‘%’에 매치 되는지 보면 됩니다. ‘ab’는 길이가 0 이상인 문자열입니다. 따라서, ‘abc’는 ‘%c’에 매치 됩니다.

‘bbb’는 ‘%c’에 매치 될까요? 일단 맨 마지막에 ‘c’가 왔으니, ‘bbb’가 ‘c’로 끝나는지 보면 됩니다. 그렇지 않지요? ‘c’가 아니라 ‘b’로 끝납니다. 따라서, ‘bbb’는 ‘%c’와 매치 되지 않습니다. 결국 ‘%c’는 접미사가 ‘c’인지 검사하는 것과 같다고 생각하시면 됩니다.

이제 ‘abc’가 ‘%b%’에 매치 되는지 볼게요. 같은 방식으로 생각해 봅시다. 앞에 ‘%’가 왔으니, 어떠한 문자열과 매치 되겠지요. 그리고 ‘b’가 오고, 또 다시 ‘%’가 옵니다. 즉, ‘b’ 앞뒤로 길이 0 이상인 문자열이 붙으면 참이 나옵니다.

‘abc’는 어떤가요? ‘b’ 앞뒤로 문자열 ‘a’와 ‘c’가 왔습니다. 따라서, ‘abc’는 ‘%b%’와 매치 됩니다. 즉, ‘%b%’ 는 부분 문자열 ‘b’를 가지는 건지 검사합니다.

다음, _는 하나의 문자와 대응된다고 했어요. 따라서 ‘a_’는 길이가 2이면서 a로 시작하는 문자열과 대응됩니다. ‘abc’는 ‘a’로 시작하지만, 길이가 2는 아니지요. 따라서, false가 리턴됩니다.

반면, ‘a_c’는 이야기가 다릅니다. ‘abc’를 봅시다. 일단 a로 시작합니다. 그 다음에 ‘b’가 오는데요. ‘b’는 문자 하나입니다. 다음에 ‘c’가 오기 때문에, ‘abc’는 ‘a_c’ 패턴에 매치됩니다.


문제는 %와 _입니다. sql like 연산자에서 이 두 문자가 특수 문자이기 때문에 escaping이 필요한 경우가 있어요. 예를 들어, %으로 시작하는지 검사를 할 경우에는 어떻게 해야 할까요? 단순히 %를 넣으면 될까요? 이것은 임의의 문자열입니다. _로 시작하는지 검사하려면요?

이럴 때 escaping을 할 수 있습니다. escaping 하려는 문자 앞에 \ 문자를 넣으면 됩니다.

먼저, ‘\%%’입니다. 처음에 오는 %가 escaping 되었기 때문에, 문자 ‘%’가 와야 합니다. 다음에 ‘%’ 가 왔기 때문에, 문자 ‘%’로 시작하는 패턴이면 참을 돌려줍니다. ‘abc’는 그렇지 않고, ‘%bc’는 그렇네요? 따라서, ret1은 false가, ret2는 참이 나옵니다.

다음 패턴은 ‘\__’ 입니다. 이것도 마찬가지입니다. 앞에 오는 ‘_’가 escaping 되었기 때문에, _로 시작해야 합니다. 그 다음에 _가 오는데요. 이건 문자 하나 입니다. 즉, _로 시작하는 길이가 2인 문자열은 매치 됩니다. ‘ab’는 그렇지 않고, ‘_b’는 그렇습니다.

Leave a Comment

17 + 1 =