Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle contient ne fonctionne pas

Deux raisons possibles :l'index n'est peut-être pas synchronisé et CONTAINS semble correspondre aux mots alors que LIKE correspond aux chaînes.

Un exemple de deux chaînes, où LIKE correspond aux deux, mais CONTAINS ne correspond à aucun :

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

Par défaut, CONTEXT les index doivent être synchronisés manuellement . Vous devez soit exécuter :exec ctx_ddl.sync_index('cidx_mustfixby'); , ou vous devez créer votre index avec on commit .

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

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

Cela résout l'un des problèmes. Mais Q234567 n'est toujours pas égalé. Je ne connais pas grand-chose à Oracle Text et je ne trouve même pas de description simple de la façon dont CONTAINS œuvres. Mais il semble être basé sur des mots complets au lieu de chaînes. Il doit y avoir une sorte de limite de mot entre Q2 et les autres caractères pour qu'il soit capté par un simple CONTAINS filtre.