Сторнирование строки с использованием индекса в Oracle - PullRequest
1 голос
/ 19 июля 2011

У меня есть таблица с идентификаторами и строками, и мне нужно иметь возможность правильно индексировать для поиска конца строк.В настоящее время мы обрабатываем это, копируя информацию в другую таблицу, переворачивая каждую строку и индексируя ее нормально.То, что я хотел бы сделать, это использовать какой-то индекс, который позволяет осуществлять поиск в обратном направлении.

Пример

Data: 
F7421kFSD1234 
d7421kFSD1235 
F7541kFSD1236 
d7421kFSD1234
F7421kFSD1235 
b8765kFSD1235 
d7421kFSD1234

То, как наши пользователи обычно вводят свой поиск, является чем-то вроде...

*1234* 1008 *

Перевернув строки (и строку поиска: 4321 *), я мог бы найти то, что искал, без полного сканирования всей таблицы.Мой вопрос: лучший способ сделать это - сделать второй стол?

Есть ли способ отменить индекс?Я попробовал подобный индекс ...

create index REVERSE_STR_IDX on TABLE(STRING) REVERSE;

, но оракул, похоже, не использует его в соответствии с объяснительным планом.

Заранее спасибо за помощь.


Обновление:

У меня возникла проблема с неправильным обращением символов Юникода.Решением этой проблемы было наложение их.

Пример:

select REVERSE(cast(string AS varchar2(2000)))
from tbl 
where id = 1

1 Ответ

8 голосов
/ 19 июля 2011

Существует миф, что для этого можно использовать индекс обратного ключа, однако я никогда не видел этого в действии.

Я бы попробовал индекс, основанный на «ручной» функции.

CREATE INDEX REVERSE_STR_IDX on TBL(reverse(string));

SELECT *
  FROM TBL
 WHERE reverse(string) LIKE '4321%';
...