Есть ли способ написать нечувствительные к регистру запросы в PostgreSQL, например. Я хочу, чтобы следующие 3 запроса возвращали одинаковый результат.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
Используйте LOWER для преобразования строк в нижний регистр перед сравнением.
Попробуйте следующее:
SELECT id
FROM groups
WHERE LOWER(name)=LOWER('Administrator')
используя ILIKE
вместо LIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
Наиболее распространенным подходом является либо строчная, либо прописная строка поиска и данные. Но есть две проблемы.
Есть, по крайней мере, три менее часто используемых решения, которые могут быть более эффективными.
CREATE INDEX ON groups (name::citext);
. (Но см. Ниже.)CREATE
INDEX ON groups (LOWER(name));
. Сделав это, вы можете воспользоваться
индекса с запросами типа SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
или SELECT id FROM groups WHERE LOWER(name) = 'administrator';
Однако вы должны помнить, что используете LOWER().Модуль citext не обеспечивает истинный тип данных, нечувствительных к регистру. Вместо этого он ведет себя так, как если бы каждая строка была нижней. То есть, он ведет себя так, как будто вы вызывали lower()
для каждой строки, как в номере 3 выше. Преимущество состоит в том, что программистам не нужно запоминать строчные строки. Но вам нужно прочитать разделы "Поведение сравнения строк" и "Ограничения" в документах, прежде чем вы решите использовать citext.
col = 'a'
и col = 'b'
). О # 2: Как вы сказали, вы можете создать индекс для выражения, так что это на самом деле не проблема. Но я согласен с вами, что изменение параметров сортировки, скорее всего, является лучшим решением.
Вы можете использовать ILIKE
. то есть.
SELECT id FROM groups where name ILIKE 'administrator'
lower
функцию. Смотрите больше деталей
Вы также можете прочитать ключевое слово ILIKE
. Иногда это может быть весьма полезно, хотя оно не соответствует стандарту SQL. См. Здесь для получения дополнительной информации: http://www.postgresql.org/docs/9.2/static/functions-matching.html
email ILIKE 'user-input-email-here'
, обязательно email ILIKE 'user-input-email-here'
пользователя. В противном случае люди могут вводить символы, такие как%, которые соответствуют чему угодно.
ILIKE
и prepared statements
, это защитит меня от sql injection
?
Вы также можете использовать регулярные выражения POSIX, например
SELECT id FROM groups where name ~* 'administrator'
SELECT 'asd' ~* 'AsD'
возвращает t
Использование ~*
может значительно улучшить производительность, с функциональностью INSTR.
SELECT id FROM groups WHERE name ~* 'adm'
возвращать строки с именем, содержащим OR, равным "adm".