Czy jest jakiś sposób na pisanie zapytań bez rozróżniania wielkości liter w PostgreSQL, np. Chcę, aby kolejne 3 zapytania zwróciły ten sam wynik.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
postgresql
Jame
źródło
źródło
Odpowiedzi:
Użyj DOLNEGO funkcji aby przekonwertować ciągi znaków na małe litery przed porównaniem.
Spróbuj tego:
źródło
varchar_pattern_ops
czy indeks ma współpracować zLIKE 'xxx%'
zapytaniem, tjCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
, będzie ona działać,but with slow response
. Aby uzyskać szybki dostęp do tabel w oparciu o wyniki obliczeń, sugeruję, aby każdy, kto to sprawdził, powinien przyjąć zaakceptowaną odpowiedź. Zobacz więcej szczegółów tutaj i tutajza pomocą
ILIKE
zamiastLIKE
źródło
ILIKE
nie jest obsługiwany przez Hibernację, gdy jest używany w Spring Boot.org.hibernate.dialect.PostgreSQL94Dialect
i Spring Boot 2.0.6. ZWOLNIJ. Ale IntelliJ narzeka na to.Najczęstszym podejściem jest albo małe lub wielkie litery szukanego ciągu i danych. Ale są z tym dwa problemy.
Istnieją co najmniej trzy rzadziej stosowane rozwiązania, które mogą być bardziej skuteczne.
CREATE INDEX ON groups (name::citext);
. (Ale patrz poniżej.)CREATE INDEX ON groups (LOWER(name));
. Po zrobieniu tego możesz skorzystać z indeksu z zapytaniami typuSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, lubSELECT id FROM groups WHERE LOWER(name) = 'administrator';
musisz pamiętać, aby użyć LOWER ().Moduł citext nie zapewnia prawdziwego typu danych bez rozróżniania wielkości liter. Zamiast tego zachowuje się tak, jakby każdy ciąg był pisany małymi literami. Oznacza to, że zachowuje się tak, jakbyś wywołał
lower()
każdy ciąg, jak w punkcie 3 powyżej. Zaletą jest to, że programiści nie muszą pamiętać o małych ciągach znaków. Ale zanim zdecydujesz się użyć citext, musisz przeczytać sekcje „Zachowanie porównywania ciągów” i „Ograniczenia” w dokumentacji.źródło
col = 'a'
icol = 'b'
). O nr 2: Jak powiedziałeś, możesz utworzyć indeks dla wyrażenia, więc tak naprawdę to nie jest problem. Ale zgadzam się z tobą, że zmiana zestawienia jest najprawdopodobniej najlepszym rozwiązaniem.select * from pg_collation;
.Możesz użyć
ILIKE
. to znaczyźródło
lower
funkcji. Zobacz więcej szczegółówMożesz także przeczytać
ILIKE
słowo kluczowe. Czasami może być dość przydatny, choć nie jest zgodny ze standardem SQL. Zobacz tutaj, aby uzyskać więcej informacji: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlźródło
email ILIKE 'user-input-email-here'
, pamiętaj, aby uciec od danych wejściowych użytkownika. W przeciwnym razie ludzie mogą wprowadzać znaki takie jak%, które pasują do dowolnego elementu.ILIKE
iprepared statements
czy to mnie ochronisql injection
?lower(column_name) like %expression%
.Możesz także użyć wyrażeń regularnych POSIX, takich jak
SELECT 'asd' ~* 'AsD'
zwrotyt
źródło
Korzystanie
~*
może znacznie poprawić wydajność dzięki funkcjonalności INSTR.zwraca wiersze o nazwie zawierającej OR równe „adm”.
źródło