Existují 3 hlavní způsoby, jak provádět vyhledávání bez rozlišení velkých a malých písmen v Oracle bez použití fulltextových indexů.
To, jakou metodu zvolíte, nakonec závisí na vašich individuálních okolnostech; hlavní věc, kterou je třeba si zapamatovat, je, že pro zlepšení výkonu musíte správně indexovat pro vyhledávání bez rozlišení velkých a malých písmen.
1. Ve sloupci a řetězci zadejte velká a malá písmena stejně.
Pomocí UPPER()
můžete vynutit, aby všechna data byla stejná jako malá a velká písmena nebo LOWER()
:
select * from my_table where upper(column_1) = upper('my_string');
nebo
select * from my_table where lower(column_1) = lower('my_string');
Pokud column_1
není indexován na upper(column_1)
nebo lower(column_1)
, podle potřeby to může vynutit úplné prohledání tabulky. Abyste tomu zabránili, můžete vytvořit index založený na funkcích.
create index my_index on my_table ( lower(column_1) );
Pokud používáte LIKE, musíte zřetězit %
kolem řetězce, který hledáte.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
Tento SQL Fiddle ukazuje, co se děje ve všech těchto dotazech. Všimněte si plánů Explain, které označují, kdy se index používá a kdy ne.
2. Používejte regulární výrazy.
Od Oracle 10g výše REGEXP_LIKE()
je k dispozici. Můžete zadat _match_parameter_ 'i'
, aby bylo možné provádět vyhledávání bez rozlišení velkých a malých písmen.
Abyste to mohli použít jako operátor rovnosti, musíte zadat začátek a konec řetězce, který je označen karátem a znakem dolaru.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
Za účelem provedení ekvivalentu LIKE je lze odstranit.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Buďte opatrní, protože váš řetězec může obsahovat znaky, které bude modul regulárních výrazů interpretovat odlišně.
Tento SQL Fiddle zobrazuje stejný příklad výstupu kromě použití REGEXP_LIKE().
3. Změňte jej na úrovni relace.
Parametr NLS_SORT řídí pořadí řazení pro řazení a různé operátory porovnání, včetně =
a LIKE. Můžete zadat binární řazení bez ohledu na velikost písmen změnou relace. To znamená, že každý dotaz provedený v této relaci bude provádět parametry bez ohledu na velikost písmen.
alter session set nls_sort=BINARY_CI
Existuje spousta dalších informací o jazykovém řazení a vyhledávání řetězců, pokud chcete zadat jiný jazyk nebo pomocí BINARY_AI vyhledávat bez použití přízvuku.
Budete také muset změnit parametr NLS_COMP; abych citoval:
Přesné operátory a klauzule dotazu, které se řídí parametrem NLS_SORT, závisí na hodnotě parametru NLS_COMP. Pokud operátor nebo klauzule nedodržuje hodnotu NLS_SORT, jak je určena NLS_COMP, použité řazení je BINARY.
Výchozí hodnota NLS_COMP je BINARY; ale LINGUISTIC uvádí, že Oracle by měl věnovat pozornost hodnotě NLS_SORT:
Porovnání všech operací SQL v klauzuli WHERE a v blocích PL/SQL by měla používat lingvistické řazení určené v parametru NLS_SORT. Chcete-li zlepšit výkon, můžete také definovat lingvistický index ve sloupci, pro který chcete jazyková srovnání.
Takže ještě jednou musíte změnit relaci
alter session set nls_comp=LINGUISTIC
Jak je uvedeno v dokumentaci, možná budete chtít vytvořit lingvistický rejstřík pro zlepšení výkonu
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));