sql >> Database >  >> RDS >> Oracle

Oracle Bevat werkt niet

Twee mogelijke redenen:de index is mogelijk niet gesynchroniseerd en CONTAINS lijkt overeen te komen met woorden terwijl LIKE komt overeen met tekenreeksen.

Een voorbeeld van twee strings, waarbij LIKE komt overeen met beide, maar CONTAINS komt overeen met geen van beide:

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

Standaard CONTEXT indexen moeten handmatig worden gesynchroniseerd . U moet ofwel uitvoeren:exec ctx_ddl.sync_index('cidx_mustfixby'); , of je moet je index maken met on commit .

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

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

Dit lost een van de problemen op. Maar Q234567 komt nog steeds niet overeen. Ik weet niet veel over Oracle Text, en ik kan niet eens een eenvoudige beschrijving vinden van hoe CONTAINS werken. Maar het lijkt te zijn gebaseerd op volledige woorden in plaats van tekenreeksen. Er moet een soort woordgrens zijn tussen Q2 en andere karakters om het te kunnen oppikken door een simpele CONTAINS filter.



  1. Hoe QUOTE() werkt in MariaDB

  2. Een tabel met voetbalgegevens van miljarden rijen partitioneren met behulp van gegevenscontext

  3. Gegevens verwijderen uit Elastisearch

  4. Hoe u het huidige Auto_Increment-volgnummer voor MySQL / MariaDB-tabel kunt krijgen