sql >> Databasteknik >  >> RDS >> Oracle

Oracle Contains fungerar inte

Två möjliga orsaker - indexet kanske inte är synkroniserat och CONTAINS verkar matcha ord medan LIKE matchar strängar.

Ett exempel på två strängar, där LIKE matchar båda, men CONTAINS matchar varken:

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

Som standard är CONTEXT index måste manuellt synkroniseras . Du måste antingen köra:exec ctx_ddl.sync_index('cidx_mustfixby'); , eller så måste du skapa ditt index med on commit .

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

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

Detta löser ett av problemen. Men Q234567 är fortfarande inte matchad. Jag kan inte mycket om Oracle Text, och jag kan inte ens hitta en enkel beskrivning av hur CONTAINS Arbetar. Men det verkar vara baserat på hela ord istället för strängar. Det måste finnas någon sorts ordgräns mellan Q2 och andra tecken för att det ska kunna tas upp av en enkel CONTAINS filter.



  1. MySql:MyISAM vs. Inno DB!

  2. PHP PDO Användarnamn Tillgänglighetskontroll

  3. mysql_install_db, fel:35, på en Mac OS X 10.9.1

  4. Varför behöver vi GLOB-satsen i SQLite?