it-swarm.com.de

PostgreSQL: Wie man "case-insensitive" Abfragen macht

Gibt es eine Möglichkeit, Abfragen ohne Berücksichtigung der Groß- und Kleinschreibung in PostgreSQL, z. Ich möchte, dass die folgenden 3 Abfragen dasselbe Ergebnis zurückgeben.

SELECT id FROM groups where name='administrator'

SELECT id FROM groups where name='ADMINISTRATOR'

SELECT id FROM groups where name='Administrator'
277
Jame

Verwenden Sie die Funktion LOWER , um die Zeichenfolgen vor dem Vergleich in Kleinbuchstaben umzuwandeln.

Versuche dies:

SELECT id 
  FROM groups
 WHERE LOWER(name)=LOWER('Administrator')
381
Chandu

mit ILIKE anstelle von LIKE

SELECT id FROM groups WHERE name ILIKE 'Administrator'
176

Am häufigsten werden die Suchzeichenfolge und die Daten in Klein- oder Großbuchstaben angegeben. Damit sind jedoch zwei Probleme verbunden.

  1. Es funktioniert auf Englisch, aber nicht in allen Sprachen. (Vielleicht nicht einmal in den meisten Sprachen.) Nicht jeder Kleinbuchstabe hat einen entsprechenden Großbuchstaben. Nicht jeder Großbuchstabe hat einen entsprechenden Kleinbuchstaben.
  2. Durch die Verwendung von Funktionen wie lower () und upper () erhalten Sie einen sequentiellen Scan. Indizes können nicht verwendet werden. In meinem Testsystem dauert die Verwendung von lower () ungefähr 2000-mal länger als eine Abfrage, die einen Index verwenden kann. (Testdaten haben etwas mehr als 100.000 Zeilen.)

Es gibt mindestens drei weniger häufig verwendete Lösungen, die möglicherweise effektiver sind.

  1. Verwenden Sie das Citext-Modul , das das Verhalten eines Datentyps nachahmt, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird. Nachdem Sie dieses Modul geladen haben, können Sie mit CREATE INDEX ON groups (name::citext); einen Index erstellen, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird. (Aber siehe unten.)
  2. Verwenden Sie eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung. Dies wird festgelegt, wenn Sie eine Datenbank initialisieren. Wenn Sie eine Sortierung verwenden, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, können Sie nahezu jedes Format aus dem Clientcode akzeptieren und dennoch nützliche Ergebnisse zurückgeben. (Es bedeutet auch, dass Sie keine Abfragen mit Groß- und Kleinschreibung durchführen können. Duh.)
  3. Erstellen Sie einen Funktionsindex. Erstellen Sie einen Index in Kleinbuchstaben mit CREATE INDEX ON groups (LOWER(name));. Danach können Sie den Index mit Abfragen wie SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR'); oder SELECT id FROM groups WHERE LOWER(name) = 'administrator'; nutzen. Sie müssen jedoch denken Sie daran verwenden, um LOWER () zu verwenden .

Das Citext-Modul bietet keinen Datentyp, bei dem die Groß- und Kleinschreibung nicht beachtet 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() für jede Zeichenfolge aufgerufen, wie in Nummer 3 oben. Der Vorteil ist, dass sich Programmierer nicht an Kleinbuchstaben erinnern müssen. Sie müssen jedoch die Abschnitte "Zeichenfolgenvergleichsverhalten" und "Einschränkungen" in den Dokumenten lesen, bevor Sie sich für citext entscheiden.

Sie können ILIKE verwenden. d.h.

SELECT id FROM groups where name ILIKE 'administrator'
91
ADJ

Sie können auch das Schlüsselwort ILIKE nachlesen. Es kann manchmal sehr nützlich sein, auch wenn es nicht dem SQL-Standard entspricht. Weitere Informationen finden Sie hier: http://www.postgresql.org/docs/9.2/static/functions-matching.html

51
Priidu Neemre

Sie können auch reguläre POSIX-Ausdrücke verwenden, z

SELECT id FROM groups where name ~* 'administrator'

SELECT 'asd' ~* 'AsD' gibt t zurück

24
James Brown

Mit ~* kann die Leistung mit der Funktionalität von INSTR erheblich verbessern.

SELECT id FROM groups WHERE name ~* 'adm'

rückgabe von Zeilen mit dem Namen OR entspricht 'adm'.

4
Robin Goh