2010-10-20 4 views
28

Как бы настроить индекс, основанный только на нижнем регистре?Как создать индекс в PostgreSQL только на нижнем регистре?

Несмотря на то, что фактическое поле содержит буквы верхнего и нижнего регистра.

Кроме того, могу ли я запустить запрос и вернуть только значение индекса нижнего регистра?

ответ

38

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

Итак:

CREATE UNIQUE INDEX lower_case_username ON users ((lower(username))); 

Тогда запрос на одно и то же:

SELECT username FROM users WHERE lower(username) = 'bob'; 
+0

Спасибо за вашу помощь! Вот мой оператор SQL: СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС «lcase_idx» ON «public». «Members» ИСПОЛЬЗОВАНИЕ btree ((lower (Memb_Name))); ОШИБКА: столбец «memb_name» не существует. Кажется, что вместо того, чтобы использовать строчный индекс Memb_Name для построения индекса, нижняя функция просто делает имя поля, на которое указывает нижний регистр. Я попробовал это с кавычками и без кавычек вокруг Memb_Name. –

+0

Какую версию PostgreSQL вы используете? Я просто сделал это на одном из моих столов (на 8.3), и он работал нормально. Что показывает «\ d public.members» для этого столбца? – Pointy

+0

Я не знаю, что такое «\ d public.members». Я использую 8.4. Я получил его для работы на другом тестовом столе. –

3
CREATE UNIQUE INDEX my_index_name ON my_table (LOWER(my_field)); 
+0

Спасибо за помощь! Вот мой оператор SQL: СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС «lcase_idx» ON «public». «Members» ИСПОЛЬЗОВАНИЕ btree ((lower (Memb_Name))); ОШИБКА: столбец «memb_name» не существует. Кажется, что вместо того, чтобы использовать строчный индекс Memb_Name для построения индекса, нижняя функция просто делает имя поля, на которое указывает нижний регистр. Я попробовал это с кавычками и без кавычек вокруг Memb_Name. –

+0

PS: Кажется, я отлично работаю ... только если имя поля - все в нижнем регистре. –

6

По the docs вы можете сделать это:

CREATE UNIQUE INDEX lower_title_idx ON films ((lower(title))); 
+0

Спасибо за помощь! Вот мой оператор SQL: СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС «lcase_idx» ON «public». «Members» ИСПОЛЬЗОВАНИЕ btree ((lower (Memb_Name))); ОШИБКА: столбец «memb_name» не существует. Кажется, что вместо того, чтобы использовать строчный индекс Memb_Name для построения индекса, нижняя функция просто делает имя поля, на которое указывает нижний регистр. Я попробовал это с кавычками и без кавычек вокруг Memb_Name. –

+0

PS: Кажется, я отлично работаю ...только если имя поля - все в нижнем регистре. –