Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Contains funktioniert nicht

Zwei mögliche Gründe – der Index ist möglicherweise nicht synchronisiert und CONTAINS scheint Wörtern zu entsprechen, während LIKE stimmt mit Strings überein.

Ein Beispiel für zwei Strings, wobei LIKE stimmt mit beiden überein, aber CONTAINS passt zu keinem von beiden:

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

Standardmäßig CONTEXT Indizes müssen manuell synchronisiert werden . Sie müssen entweder Folgendes ausführen:exec ctx_ddl.sync_index('cidx_mustfixby'); , oder Sie müssen Ihren Index mit on commit erstellen .

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

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

Dies behebt eines der Probleme. Aber Q234567 ist immer noch nicht abgestimmt. Ich weiß nicht viel über Oracle Text, und ich kann nicht einmal eine einfache Beschreibung dafür finden, wie CONTAINS funktioniert. Aber es scheint auf ganzen Wörtern statt auf Strings zu basieren. Es muss eine Art Wortgrenze zwischen Q2 und anderen Zeichen geben, damit es von einem einfachen CONTAINS aufgenommen werden kann filtern.