Gibt es eine Möglichkeit, Abfragen ohne Berücksichtigung der Groß- und Kleinschreibung in PostgreSQL zu schreiben? Ich möchte beispielsweise, dass die folgenden drei Abfragen dasselbe Ergebnis liefern.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
postgresql
Jame
quelle
quelle
Antworten:
Verwenden Sie die LOWER- Funktion, um die Zeichenfolgen vor dem Vergleich in Kleinbuchstaben umzuwandeln.
Versuche dies:
quelle
varchar_pattern_ops
Sie außerdem an, ob der Index mitLIKE 'xxx%'
Abfragen arbeiten soll, zCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
: Es wird funktionierenbut with slow response
. Um einen schnellen Zugriff auf Tabellen zu erhalten, die auf den Ergebnissen von Berechnungen basieren, empfehle ich jedem, der dies nur überprüft, die akzeptierte Antwort zu verwenden. Weitere Details finden Sie hier und hiermit
ILIKE
anstelle vonLIKE
quelle
ILIKE
Ruhezustand bei Verwendung in Spring Boot nicht unterstützt wird.org.hibernate.dialect.PostgreSQL94Dialect
und Spring Boot 2.0.6.RELEASE. Aber IntelliJ beschwert sich darüber.Der gebräuchlichste Ansatz besteht darin, die Suchzeichenfolge und die Daten entweder in Klein- oder Großbuchstaben zu schreiben. Damit sind jedoch zwei Probleme verbunden.
Es gibt mindestens drei weniger häufig verwendete Lösungen, die möglicherweise effektiver sind.
CREATE INDEX ON groups (name::citext);
. (Aber siehe unten.)CREATE INDEX ON groups (LOWER(name));
. Nachdem Sie dies getan haben, können Sie den Index mit Abfragen wie nutzenSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, oderSELECT id FROM groups WHERE LOWER(name) = 'administrator';
Sie müssen daran denken , LOWER () zu verwenden.Das citext-Modul bietet keinen Datentyp, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird. Stattdessen verhält es sich so, als ob jede Zeichenfolge in Kleinbuchstaben geschrieben wäre. Das heißt, es verhält sich so, als hätten Sie
lower()
jede Zeichenfolge aufgerufen , wie in Nummer 3 oben. Der Vorteil ist, dass Programmierer nicht daran denken müssen, Zeichenfolgen in Kleinbuchstaben zu schreiben. Sie müssen jedoch die Abschnitte "Verhalten beim Vergleichen von Zeichenfolgen" und "Einschränkungen" in den Dokumenten lesen, bevor Sie sich für die Verwendung von citext entscheiden.quelle
col = 'a'
undcol = 'b'
). Zu # 2: Wie Sie sagten, können Sie einen Index für einen Ausdruck erstellen, sodass dies kein wirkliches Problem darstellt. Aber ich stimme Ihnen zu, dass das Ändern der Sortierung höchstwahrscheinlich die beste Lösung ist.select * from pg_collation;
.Sie können verwenden
ILIKE
. dhquelle
lower
Funktion. Weitere DetailsSie können auch das
ILIKE
Schlüsselwort nachlesen . Es kann manchmal sehr nützlich sein, obwohl es nicht dem SQL-Standard entspricht. Weitere Informationen finden Sie hier: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlquelle
email ILIKE 'user-input-email-here'
die Benutzereingaben umgehen. Andernfalls können Personen Zeichen wie% eingeben, die mit etwas übereinstimmen.ILIKE
undprepared statements
wird mich das schützensql injection
?lower(column_name) like %expression%
.Sie können auch reguläre POSIX-Ausdrücke verwenden, z
SELECT 'asd' ~* 'AsD'
kehrt zurückt
quelle
Die Verwendung
~*
kann die Leistung mit der Funktionalität von INSTR erheblich verbessern.Zeilen mit einem Namen zurückgeben, der OR enthält, entspricht 'adm'.
quelle