Поиск без учета регистра в базе данных с индексом?

Я использую Постгрес.

У меня есть таблица Artices в моей базе данных с URL-адресом столбца для URL-слагов. Это сделано для того, чтобы я мог отображать статьи в этой таблице на веб-сайте не как «example.com/23323», а как «example.com/Funny_Thing_Happened_to_Me». Это было достаточно просто реализовать, а затем, когда количество статей росло, я добавил индекс в таблицу кратких URL-адресов.

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

Есть ли простой способ быстрого поиска по текстовому столбцу без учета регистра, а также обеспечения уникальности без учета регистра?

Я пробовал проводить поиск с чем-то вроде lower(url) =, но это заставляет Postgres вообще не использовать индекс.


person William Jones    schedule 30.07.2010    source источник


Ответы (2)


Используйте функциональный индекс:

CREATE UNIQUE INDEX ix_test1 on articles (lower(url));

Если вы используете версию 8.4 и можете установить модуль contrib, взгляните также на citext тип. Он абстрагируется от всего нижнего/ВЕРХНЕГО материала и немного лучше работает.

person rfusca    schedule 30.07.2010
comment
Спасибо, кажется, это путь. Единственная проблема заключается в том, что я не могу напрямую создать индекс из-за существующих конфликтов на нижнем (url), но я не вижу никакого способа обойти это, кроме исправления данных. - person William Jones; 31.07.2010
comment
@williamjones: на данный момент добавьте индекс как неуникальный, чтобы получить преимущество в производительности. Затем исправьте уникальность, создайте новый уникальный индекс и удалите старый. - person rfusca; 31.07.2010

SELECT * FROM sometable WHERE textfield ILIKE 'value%';

Это то, что вы ищите? Что вы подразумеваете под «обеспечить уникальность без учета регистра»?

Или это, если вы хотите придерживаться "lower()":

SELECT * FROM sometable WHERE UPPER(textfield) LIKE (UPPER('value') || '%');
person Matt N.    schedule 30.07.2010