반응형

 문자열에서, 패턴 일치를 검사할 때 무엇을 쓸 수 있을까요? 가장 쉽게 생각할 수 있는 것은 Like입니다. 이것도 예제를 천천히 보도록 합시다.

 

 


 이 포스팅에 쓸 재료는 다음 테이블입니다. 제가 예전에 만들어 두었던 worker 테이블입니다.

 

 

 여기에는 다음과 같은 데이터들이 들어가 있습니다. 여기서 worker_name이 대문자 A로 시작하는 패턴을 찾고 싶습니다. 어떻게 하면 좋을까요?

 

 

 요렇게 쓰시면 됩니다. 이것은 A로 시작하는 패턴을 찾아라. 라는 말과 같습니다. 여기서 '%'라는 문자가 궁금하실 수 있는데요. 이것은 어떠한 패턴과도 일치한다는 소리입니다. 예를 들어, %가 하나 붙어 있으면, 아무것도 없는 빈 문자열과도 일치하고, 'p'라는 것과도 일치합니다.

 

 그러면 'Asia'는 'A%'라는 패턴에 매칭이 될까요? 네. 맞습니다. 일단 A로 시작했고, %는 어떠한 패턴과도 일치하기 때문입니다. A 뒤에 오는 건 'sia'라는 것인데, 이것은 '어떠한' 것들 중 하나입니다. 따라서 참이 됩니다.

 

 

 이 둘만 출력되겠네요. 이제 테이블에 데이터를 하나 추가해 봅시다.

 

 

 딱 봐도 무엇을 할 거 같은지 아실 듯 싶은데, NULL 값을 가지는 value를 하나 추가했습니다. 즉, worker_name이 null인 데이터가 하나 들어왔는데요. 이 경우에 NULL 값은 어떻게 처리될까요?

 

 

 Like 연산자에 not이 붙으면, 이 패턴을 가지는 worker_name이 아닌 것을 찾으라는 겁니다. 즉, 대문자 A로 시작하지 않는 패턴을 모두 검색하라는 소리입니다. 결과 행이 5개가 나올 거 같습니다.

 

 

 그런데 제 환경에서는, 4개의 행만 출력되었어요. NULL 값은 어떠한 값인지 모르기 때문에, 평가되지 못하기 때문입니다. 이 친구가 Apple인지, App인지, cho인지, 알 길이 없어요. 참인 지도 모르고 거짓인 지도 모르니, 출력이 되지는 않을 거에요. 제 환경에서는 그렇습니다.

 

 NULL값 편에서도 언급을 했지만, 이것을 다룰 때는 주의해야 한다고 언급을 했었습니다.

 

 

 그러면 이것은 무엇을 의미할까요? %는 모든 문자열에 대응이 됩니다. 그 다음에 e가 왔다? 이것은 e로 끝나는 패턴을 찾으라는 의미입니다.

 

 

 이것은 어떤가요? 임의의 문자열 + si라는 패턴 + 임의의 string? 이것은 레코드의 필드 worker_name이, si라는 부분 문자열을 가지고 있는지 검사하는 것입니다. 예를 들어 'Asia'는 'si'를 부분 string으로 가지지만, 'Bob'은 그러지 못합니다.

 

 


 '_'은 어떠한 한 문자와 일치하는 패턴입니다. 예를 들어 _는 'a', 'c'와는 일치하지만 'ab'라던지 ''와는 일치하지 않습니다. 왜냐하면, '_'이라는 것은 길이가 1인 문자열만 matching이 되기 때문입니다. 'ab'는 길이가 2이고, ''은 0입니다.

 

 

 이 문장을 해석해 봅시다. T 뒤에 _이 2개 왔습니다. 그러면 T로 시작하고, 길이가 3인 패턴을 찾으라는 겁니다.

 

 

 이것은 Tom밖에 없습니다.

 

 

 그러면 이것은 어떤 의미인가요? 일단 T 다음에 _이 2개 왔습니다. 그러면 T로 시작하고, 그 다음에 길이가 1인 문자열 하나가 오고, 또 길이가 1인 것이 온다는 겁니다. 다음에 %가 왔는데요. 이것은 임의의 string과 matching이 됩니다. 즉, worker_nam이 T로 시작하고, 최소한 길이가 3인 pattern을 가지는 레코드를 출력하라는 겁니다.

 

 

 이것은 2개가 있습니다.

 

 


 우리는 Likes 연산을 배웠습니다. 그리고 와일드 카드인 _와 %를 배웠습니다. 전자는 어떠한 한 문자와 일치하는 것, 후자는 어떠한 문자열과도 일치하는 것. 그러면 우리가 배운 내용만을 바탕으로, worker_name 필드가 모음으로 시작하는 레코드를 모두 출력하는 쿼리를 작성해 보도록 합시다.

 

 

 그러면, 대문자까지 고려해야 하니까, or 연산자로 걸린 조건만 10개가 될 건데, 이것은 너무 길어 보입니다. 이 부분을 어떻게 줄일 수 있는지는 다음에 계속 해 보도록 하겠습니다.

반응형

댓글을 달아 주세요

  1. 곰곰지영

    잘 보고 가요옹~ :D

  2. 한번사는인생.

    보면서 눈에 계속 걸리는게...있네요ㅜ.ㅜ
    테이블은 worker 인데, 굳이 컬럼까지 worker_name...ㅜ.ㅜ(name이 좋을거같아요ㅎㅎ)

    그리고 와일드카드라는건 처음 알았네요
    하나 배우고 갑니다!