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

Vyhledávání bez rozlišení malých a velkých písmen v Oracle

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


  1. SQL Server BULK INSERT z Linuxu

  2. Získejte první den v týdnu na serveru SQL

  3. Funkce formátu data serveru SQL Server

  4. získat řadu jedinečných hodnot bez oddělování hodnot, které patří do stejného bloku hodnot