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

Dotaz se zástupným znakem a tečkou, která neodpovídají datům s indexem Oracle Text

Je to proto, že váš výchozí lexer považuje tečku za oddělovač slov.

Počáteční nastavení:

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;

Tím získáte chování, které vidíte:

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

Pokud přidáte lexer, který definuje PRINTJOINS zahrnout období:

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');

pak se chová tak, jak chcete:

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

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

Přečtěte si další informace o prvcích indexování textu .



  1. Ukládání šifrovaných dat v Postgresu

  2. Seřaďte sestupně podle data - měsíc, den a rok

  3. Použití proměnné v klauzuli LIMIT v MySQL

  4. Sql dotaz prázdný výsledek na php kód