sql >> Databáze >  >> RDS >> Oracle

Oracle Contains nefunguje

Dva možné důvody – index nemusí být synchronizován a CONTAINS Zdá se, že odpovídá slovům, zatímco LIKE odpovídá řetězcům.

Příklad dvou řetězců, kde LIKE odpovídá oběma, ale CONTAINS neodpovídá ani jednomu:

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

Ve výchozím nastavení CONTEXT indexy je třeba ručně synchronizovat . Buď musíte spustit:exec ctx_ddl.sync_index('cidx_mustfixby'); , nebo si musíte vytvořit index pomocí on commit .

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

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

To řeší jeden z problémů. Ale Q234567 se stále neshoduje. O Oracle Text toho moc nevím a nemohu ani najít jednoduchý popis toho, jak CONTAINS funguje. Zdá se však, že je založen na plných slovech namísto řetězců. Mezi Q2 a dalšími znaky musí být nějaká hranice slova, aby to bylo možné zachytit jednoduchým CONTAINS filtr.



  1. Vložte více řádků výchozích hodnot do tabulky

  2. LISTAGG v Oracle pro vrácení odlišných hodnot

  3. Mám tento kód, který funguje dobře, ale chci změnit kód na jinou strukturu

  4. Je substr nebo LIKE rychlejší v Oracle?