2010-01-29 3 views
2

여러 열에 걸쳐 like 또는 regexp을 수행하고 싶습니다. 이러한 열은 동등한의 태그, 키워드 등 뭔가가 들어 내가Oracle : 여러 열에서 "grep"?

select * from foo where c1 || c2 || c3 like '%somestring%' 

같은 것을 가지고 있지만 내가 뭔가를 얻을 수 바라고 있어요 지금

sqlplus scott/tiger @myquery.sql | grep somestring 

을 좀 더 범용 및/또는 최적화. 모든 단서를 높이 평가!

답변

3

Concatenated Datastore Oracle Text의 기능을 사용 해본 적이 있습니까?

Oracle Text를 사용하면 동일한 테이블의 여러 열에 전체 텍스트 인덱스를 생성 할 수 있습니다. 또는 최소한이 작업을 수행 할 수있는 프로세스가 있습니다.

내가 전에 사용했던 오라클 사이트에서 좋은 예를 문서있다 :

http://www.oracle.com/technology/sample_code/products/text/htdocs/concatenated_text_datastore/cdstore_readme.html

오라클 텍스트 검색이 안되게 빠르다. 각 열의 일치에 대해 관련성과 우선 순위를 적용 할 수 있도록 각 개별 열에 별도의 컨텍스트 인덱스를 유지하는 방법을 생각합니다.

예를 들어 알려 주시면 답변에 답변을 추가하겠습니다.

희망이 도움이됩니다.

3

11G에서 당신은 가상 열을 만들 수 있습니다

alter table foo add all_text varchar2(4000) generated always as (c1 ||','|| c2 ||','|| c3); 

(Oracle 11G new features 참조).

그런 다음 쿼리가 (이 도움이 언제하지 않을 수 있습니다 경우에 대한 this answer 참조)도 성능에 도움이된다면

select * from foo where all_text like '%somestring%' 

당신은 all_text에 인덱스를 추가 할 수 있습니다.

11G 이전에는 트리거를 통해 유지 관리되는 일반 열과 동일한 작업을 수행 할 수있었습니다.

0
SELECT * FROM table WHERE REGEXP_LIKE(col1, <pattern>) 
union 
SELECT * FROM table WHERE REGEXP_LIKE(col2, <pattern>) 
union 
SELECT * FROM table WHERE REGEXP_LIKE(col3, <pattern>) 

이렇게하면됩니다. 그러나 이것은 당신의 쿼리보다 성능면에서 좋을지는 의심 스럽습니다. 당신은 둘 다의 성과를 비교하고 싶을지도 모르다. 당신의 연구 결과를 듣고 정말로 사랑합니다. :-)