Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle Zawiera nie działa

Dwie możliwe przyczyny - indeks może nie być zsynchronizowany i CONTAINS wydaje się pasować do słów, gdy LIKE dopasowuje ciągi.

Przykład dwóch ciągów, gdzie LIKE pasuje do obu, ale CONTAINS nie pasuje do żadnego:

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

Domyślnie CONTEXT indeksy muszą być ręcznie synchronizowane . Musisz albo uruchomić:exec ctx_ddl.sync_index('cidx_mustfixby'); , lub musisz utworzyć indeks za 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 rozwiązuje jeden z problemów. Ale Q234567 nadal nie jest dopasowany. Nie wiem zbyt wiele o Oracle Text i nie mogę nawet znaleźć prostego opisu tego, jak CONTAINS Pracuje. Ale wydaje się, że opiera się na pełnych słowach, a nie na ciągach. Musi istnieć jakaś granica słów między Q2 a innymi znakami, aby mogła zostać pobrana przez proste CONTAINS filtr.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przykład instrukcji Oracle FOR LOOP SELECT

  2. Jak profilować wydajność procedury składowanej Oracle od początku do końca?

  3. Transpozycja wybranych wyników za pomocą Oracle

  4. Porady dotyczące korzystania z tabeli przestawnej w Oracle

  5. Rozmiar magazynu Oracle NUMBER(p)?