兩個可能的原因 - 索引可能不同步,並且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
過濾器進行拾取。
你想用第二個查詢來完成什麼?你想要一個計數(包含(must_fix_by,'Q2'))> 0爲了找出有多少記錄包含該字符串? – thursdaysgeek 2013-03-13 20:50:32
我希望查詢返回must_fix_by中具有Q2的所有行。我知道我可以去LIKE,但我想知道爲什麼包含不起作用。 – Jeevan 2013-03-13 21:58:18
哦,對不起,我看錯了這個問題。 – thursdaysgeek 2013-03-13 22:06:48