Есть ли способ написать регистронезависимые запросы в PostgreSQL, например, я хочу, чтобы следующие 3 запроса возвращали один и тот же результат.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
postgresql
Джейм
источник
источник
Ответы:
Используйте функцию LOWER для преобразования строк в нижний регистр перед сравнением.
Попробуй это:
источник
varchar_pattern_ops
если вы хотите, чтобы индекс для работы сLIKE 'xxx%'
запросом, то естьCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
, Это будет работатьbut with slow response
. Чтобы получить быстрый доступ к таблицам на основе результатов вычислений, я предлагаю всем, кто просто проверит это, пойти с принятым ответом. Подробнее здесь и здесьиспользуя
ILIKE
вместоLIKE
источник
ILIKE
Hibernate не поддерживается при использовании в Spring Boot.org.hibernate.dialect.PostgreSQL94Dialect
Spring Boot 2.0.6.RELEASE. Но IntelliJ жалуется на это.Наиболее распространенным подходом является строчная или прописная строка поиска и данных. Но есть две проблемы с этим.
Существует как минимум три менее часто используемых решения, которые могут быть более эффективными.
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: Как вы сказали, вы можете создать индекс для выражения, так что на самом деле это не проблема. Но я согласен с вами, что изменение параметров сортировки, скорее всего, является лучшим решением.select * from pg_collation;
.Вы можете использовать
ILIKE
. т.е.источник
lower
функцию. Другие подробностиВы также можете прочитать по
ILIKE
ключевому слову. Иногда это может быть полезно, хотя и не соответствует стандарту SQL. Смотрите здесь для получения дополнительной информации: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlисточник
email ILIKE 'user-input-email-here'
, убедитесь, что экранирование ввода пользователя. В противном случае люди могут вводить символы, такие как%, которые соответствуют чему угодно.ILIKE
иprepared statements
защитит ли это меняsql injection
?lower(column_name) like %expression%
.Вы также можете использовать регулярные выражения POSIX, такие как
SELECT 'asd' ~* 'AsD'
возвращаетсяt
источник
Использование
~*
может значительно улучшить производительность, с функциональностью INSTR.вернуть строки с именем, которое содержит ИЛИ равно 'adm'.
источник