2013-03-13 150 views
5

我在我的表中有一個上下文索引的列。Oracle包含不起作用

CREATE INDEX CIDX_MUSTFIXBY ON TABLE 
    (MUST_FIX_BY) 
INDEXTYPE IS CTXSYS.CONTEXT 
NOPARALLEL; 

,我試圖用WHERE條件

和must_fix_by LIKE '%Q2'

查詢並返回行。

然而,當我嘗試查詢與WHERE條件

,幷包含(must_fix_by, 'Q2')> 0

,它不返回任何行。

有人可以告訴我,爲什麼像工作和包含不是?

+0

你想用第二個查詢來完成什麼?你想要一個計數(包含(must_fix_by,'Q2'))> 0爲了找出有多少記錄包含該字符串? – thursdaysgeek 2013-03-13 20:50:32

+0

我希望查詢返回must_fix_by中具有Q2的所有行。我知道我可以去LIKE,但我想知道爲什麼包含不起作用。 – Jeevan 2013-03-13 21:58:18

+0

哦,對不起,我看錯了這個問題。 – thursdaysgeek 2013-03-13 22:06:48

回答

5

兩個可能的原因 - 索引可能不同步,並且CONTAINS似乎匹配單詞,而LIKE匹配字符串。

兩個字符串,其中LIKE同時匹配,但CONTAINS比賽既不是一個例子:

create table test1(must_fix_by varchar2(4000)); 
create index cidx_mustfixby on test1(must_fix_by) indextype is ctxsys.context; 
insert into test1 values('Q234567'); 
insert into test1 values('Q2 234567'); 
select * from test1 where must_fix_by like 'Q2%'; 

MUST_FIX_BY 
----------- 
Q234567 
Q2 234567 

select * from test1 where contains(must_fix_by, 'Q2') > 0; 

no rows selected 

默認情況下,CONTEXT指標必須manually synchronized。您需要運行:exec ctx_ddl.sync_index('cidx_mustfixby');,或者您需要創建索引on commit

exec ctx_ddl.sync_index('cidx_mustfixby'); 
select * from test1 where contains(must_fix_by, 'Q2') > 0; 

MUST_FIX_BY 
----------- 
Q2 234567 

這解決了其中一個問題。但Q234567仍然不匹配。我對Oracle Text並不瞭解,而且我甚至無法找到關於CONTAINS如何工作的簡單說明。但它似乎是基於完整的單詞而不是字符串。 Q2和其他字符之間需要有某種字邊界 ,以便通過簡單的CONTAINS過濾器進行拾取。

+0

謝謝你jonearles – Jeevan 2013-03-14 13:18:21