2016-02-02 2 views
0

Как я получу все customer_names, начиная с 'a' от customer?Как получить регистрозависимые записи из оракула?

Для этого я хочу получить все имена, содержащие букву a, независимо от чувствительности к регистру. Я не хочу использовать to_upper(), потому что это негативно скажется на производительности запросов.

+0

Вы ищете только для 'A'? или для любой буквы? или для любой строки? –

+0

Поиск буквы «A» возвращает много строк, и любой индекс не будет полезен для производительности. Вы уверены, что хотите получить доступ к индексу? –

+0

Я думаю, что ваш хит «to_upper» невелик по сравнению с поиском '% a%'. – Stefan

ответ

0

Получение имен, которые содержит, буква «a», вероятно, потребует полного сканирования таблицы. Вы можете сделать что-то вроде этого:

where name like '%a%' or name like '%A%' 

или

where lower(name) like '%a%' 

В большинстве случаев, это потребует полного сканирования таблицы.

Если вы просто ищете строки, которые начинаются с «а», то вы можете сделать:

select t.* 
from table t 
where t.name like 'a%' 
union all 
select t.* 
from table t 
where t.name like 'A%'; 

Это может использовать индекс на t(name). Тем не менее, это все еще не может использовать индекс, потому что такие строковые операции могут быть недостаточно избирательными.

+0

Первый подход неверен для более чем одной буквы. (Пример: aBc). Второй подход потребует времени. Что-нибудь еще? – krishnapriya

+2

@krishnapriya, что не так с первым подходом ?. Условие ** будет ** получать эту строку. Кроме того, они равны быстро. Будет развернуто полное сканирование таблицы. –

+0

@krishnapriya, ответ от Justin Cave будет работать с любой подстрокой, и он будет использовать индекс на основе функций, поэтому я бы выбрал это решение. – MaxU

2

Если вы просто обеспокоены производительности, вы можете создать индекс-функции

create index idx_fbi_upname 
on 
table(upper(name)); 

select * 
    from table t 
where upper(t.name) like 'A%' 

Этот запрос может использовать индекс на upper(name). Конечно, если вы хотите делать как чувствительные к регистру, так и не зависящие от регистра запросы, вы можете оказаться в два раза выше, чем индексы, которые потребуют большего объема памяти и больше работы для поддержания.

Смежные вопросы