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

Zapytanie z symbolem wieloznacznym i niedopasowaniem danych do indeksu Oracle Text

Dzieje się tak, ponieważ domyślny lekser traktuje kropkę jako separator słów.

Konfiguracja wstępna:

create table my_table(item_number varchar2(50 byte) not null);

insert into my_table values ('1234.1234');

create index my_index on my_table (item_number) 
indextype is ctxsys.context;

Powoduje to zachowanie, które widzisz:

SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0;

--------------------------------------------------
1234.1234

SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;

no rows selected

Jeśli dodasz lekser, który definiuje PRINTJOINS aby uwzględnić kropkę:

drop index my_index;

begin 
  ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER'); 
  ctx_ddl.set_attribute('my_lexer', 'PRINTJOINS', '.');
end;
/

create index my_index on my_table (item_number) 
indextype is ctxsys.context
parameters ('lexer my_lexer');

wtedy zachowuje się tak, jak chcesz:

SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;

ITEM_NUMBER
--------------------------------------------------
1234.1234

Przeczytaj więcej o elementach indeksujących tekst .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL — Jak uzyskać różne wiersze za pomocą funkcji analitycznych RANK() lub DENSE_RANK() lub ROW_NUMBER()?

  2. JDBC:Oracle Application Server i karta sieciowa nie mogły nawiązać błędu połączenia

  3. ORA-01653:nie można rozszerzyć stołu w przestrzeni tabel ORA-06512

  4. eliminacja znaków specjalnych w wyrażeniach regularnych

  5. REGEX, aby wybrać n-tą wartość z listy, pozwalając na wartości null