그렇습니다. ~* 연산자와 ~ 연산자는 MySQL 의 REGEXP 와 유사한 연산자로서 regular expression 으로 비교연산을 가능하게 합니다. 이중에서 ~ 는 대소문자 구별하여 regular expression search 를 하고, ~* 는 대소문자 구별을 하지 않고 regular expression search 를 시행합니다.
그러니 말씀하신 내용은 정확히 맞습니다. 하지만 몇가지 문제를 짚고 넘어가야 합니다. 속도상의 이득이 있을것인가 하는 것입니다. 굳이 단어로 찾을 예정이라면 ~* '.*search_text.*' 이런식의 수식은 그냥 like lower('search_text') 보다 엄청나게 느리게 됩니다. 그러므로 그렇게 옳바른 방법은 아닌 것 같습니다. 물론 이런 경우는 편하겠지요. 문자열의 처음이 advance 로 시작하는 문장을 찾아라. 이런 경우라면 저 정규식 연산자를 사용하지 않고는 해결이 되질 않는답니다. 개인적으로 프로그래밍을 할때 많이 사용하는 연산자이지만 함부로 정규식을 사용하는 것은 자제합니다. 10만 row 가 넘어 갈경우 복잡한 정규식을 사용하면 엄청난 인내심을 요구할 수도 있기 때문입니다.
> 제가 pstgresql로 대소문자 검색을 하고자 했는데..
> 그것에 관한 문서가 눈에 쉽게 안 띄었고,,
> View를 만든다던지하는 편법(?)을 써야 하는 걸로 여기 게시판에 올라와 있었습니다.
> 그런데..
> 제가 postgresql Mailing list에 찾아 보니깐..
> 흥미로운 부분이 있어서 이렇게 글을 올립니다.
>
> 여기서부터는 내용입니다.
>
> > I have this script:
> > SELECT a.attname, t.typname, a.attlen
> > FROM pg_class c, pg_attribute a, pg_type t
> > WHERE c.relname = 'regis' and a.attname in
> > ('var1','var2',var3');
> >
> > but a.attname is of type name, inwhich text(..) or lower(..)
> > do not work with this type and I do not seem to be able to
> > convert type name to text....
> >
> > Can someone help me get around this?
> >
>
> You could use case/insensitive regex operator / Your query should looks
> like following:
> SELECT a.attname, t.typname, a.attlen
> FROM pg_class c, pg_attribute a, pg_type t
> WHERE c.relname = 'regis' and (a.attname ~*'var1' OR
> a.attname~*'var2' OR a.attname~*'var3');
> May be this helps
> Rem
>
>
>
> 여기에 보면,
> a.attname ~*'var1'
> 라는 부분이 있습니다.
> ~* 는 제가 해본 결과 like '%text%'
> 와 같은 구문으로 text가 대소문자를 구분하지 않는 것 같습니다.
> 아직 확실히 테스트를 하지는 못했지만..
> 이 방법이 대소문자를 구분하지 않고 select하는 가장 확실한 방법 같네요..
> 그럼 열심히..~
|