Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle Contém não está funcionando


Dois motivos possíveis - o índice pode não ser sincronizado e CONTAINS parece corresponder às palavras enquanto LIKE corresponde a cadeias de caracteres.

Um exemplo de duas strings, onde LIKE corresponde a ambos, mas CONTAINS não corresponde a:
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

Por padrão, CONTEXT os índices precisam ser sincronizados manualmente . Você precisa executar:exec ctx_ddl.sync_index('cidx_mustfixby'); , ou você precisa criar seu índice com on commit .
exec ctx_ddl.sync_index('cidx_mustfixby');
select * from test1 where contains(must_fix_by, 'Q2') > 0;

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

Isso corrige um dos problemas. Mas Q234567 ainda não é correspondido. Eu não sei muito sobre o Oracle Text e não consigo encontrar uma descrição simples de como CONTAINS funciona. Mas parece ser baseado em palavras completas em vez de strings. Deve haver algum tipo de limite de palavra entre Q2 e outros caracteres para que seja captado por um simples CONTAINS filtro.