PostgreSQL: Wie man "case-insensitive" - Abfrage
Gibt es eine Möglichkeit zum schreiben von groß-und Kleinschreibung Anfragen in PostgreSQL, E. g. Ich will, dass die folgenden 3 Abfragen return gleichen Ergebnis.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
wenn citext kommt mit Ihrer Postgres installation, versuchen citext-Typ. Es ist der groß-und Kleinschreibung text
Für Neulinge in dieser Frage, diesen link, um die offizielle PostgreSQL-Dokumentation enthält alle Antworten, die hier gegeben werden, sowie ein paar andere Optionen.
Sir zuweisen akzeptierte Antwort auf das von @Arun bitte. Es ist viel weniger kompliziert und tun nicht ziehen Bündel von Problemen nach der Anwendung.
Für Neulinge in dieser Frage, diesen link, um die offizielle PostgreSQL-Dokumentation enthält alle Antworten, die hier gegeben werden, sowie ein paar andere Optionen.
Sir zuweisen akzeptierte Antwort auf das von @Arun bitte. Es ist viel weniger kompliziert und tun nicht ziehen Bündel von Problemen nach der Anwendung.
InformationsquelleAutor Jame | 2011-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden UNTERE Funktion zum umwandeln des strings in Kleinbuchstaben vor dem Vergleich.
Versuchen Sie dies:
Oder erstellen Sie einfach einen index wie dieser: CREATE INDEX idx_groups_name AUF Gruppen niedriger(name);
Geben Sie auch
varchar_pattern_ops
wenn Sie möchten, dass der index mitLIKE 'xxx%'
Abfrage, d.h.CREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.Mit dem ILIKE-operator (siehe weitere Antworten, unten) ist ein einfacher Ansatz, auch wenn dies den meisten Stimmen beantworten.
Hinzufügen @miR ' s Kommentar: während die ILIKE-Ansatz ist syntaktisch viel einfacher, es wird NIE versuchen, einen index verwenden - somit, falls die Leistung ist von großer Bedeutung für Sie ist, sollten Sie mit Chandu ist Lösung w/ index zeigte von Daniel & sayap statt.
InformationsquelleAutor Chandu
mit
ILIKE
stattLIKE
Ich sehe nicht, was er fügt, im Vergleich zu @Jaiswal ' s Antwort, der 8 Monate zuvor.
es zeigt sich klar, dass es einem GEFÄLLT, und groß-und Kleinschreibung WIE. Es könnte wahrscheinlich besser gewesen, eine Bearbeitung zu Jaiswal Antwort, aber es ist immer noch eine bessere Antwort aufgrund, dass
zu beachten: 1 line break=15 upvotes 🙂
Ich habe "Воскресенск" und "Новоселово" in der Datenbank und ich möchte beide Holen, indem Sie nach "%вос%". LOWER() nicht lösen.
InformationsquelleAutor Mohammad Reza Norouzi
Die häufigste Methode ist, entweder in groß-oder Kleinschreibung dem Suchbegriff und der Daten. Aber es gibt zwei Probleme mit diesem.
die meisten Sprachen.) Nicht jeder Kleinbuchstabe eine entsprechende
Großbuchstaben; nicht jeder Großbuchstabe eine entsprechende
Kleinbuchstaben.
scan. Es können keine Indizes verwenden. Auf meinem test-system, mit niedrigeren() nimmt
über 2000 mal länger als eine Abfrage, die einen index verwenden. (Test der Daten hat ein wenig über 100k Zeilen.)
Gibt es mindestens drei weniger Häufig verwendete Lösungen, die wirksamer sein könnten.
CREATE INDEX ON groups (name::citext);
. (Aber siehe unten).Datenbank. Mit einem case-insensitive Sortierung bedeutet, dass Sie akzeptieren können
einfach über jedem beliebigen format von der client-code, und Sie werden immer noch zurückgeben
nützliche Ergebnisse. (Es bedeutet auch Sie können nicht case-sensitive Abfragen. Duh.)
CREATE
. Wenn dies erledigt ist, können Sie die VorteileINDEX ON groups (LOWER(name));
der index mit Anfragen wie
SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
oderSELECT id FROM groups WHERE LOWER(name) = 'administrator';
müssen Sie erinnern zu verwenden, UNTEREN(), obwohl.Den citext-Modul nicht bieten eine true-case-insensitive Daten geben. Stattdessen verhält es sich so, als ob jede saite wurden kleingeschrieben. Das heißt, es verhält sich so, als wenn Sie angerufen hatte
lower()
auf jeder saite, wie in Nummer 3 oben. Der Vorteil ist, dass die Programmierer nicht daran denken müssen strings in Kleinbuchstaben. Aber Sie brauchen, um die Abschnitte zu Lesen, "String-Vergleich Verhalten" und "Einschränkungen" in den docs, bevor Sie sich entscheiden, citext.col = 'a'
undcol = 'b'
). Zu #2: Wie Sie sagten, können Sie einen index erstellen, der auf einem Ausdruck, so ist es nicht wirklich ein problem. Aber ich Stimme mit Ihnen überein, dass eine änderung der Sortierung ist wahrscheinlich die beste Lösung.Kann mir jemand sagen, was groß- / Kleinschreibung Sortierungen sind PostgreSQL-built-in-Sortierungen ? Ich sehe dies als eine option, aber kann nichts finden über eine case-insensitive Sortierung für Postgres auf dem Netz ?
Nein, ich sage nicht, dass. Ich bin mir nicht läuft PostgreSQL auf Windows. 9.4 Die docs sagen, das: "Auf allen Plattformen, die Sortierungen, die mit dem Namen default, C und POSIX sind verfügbar. Zusätzliche Sortierungen können verfügbar sein, je nach Betriebssystem unterstützen." Sehen Sie, welche Sortierungen PostgreSQL denkt, sind verfügbar mit
select * from pg_collation;
.Dies ist die beste Einführung (und Vorsicht) zu dem Thema, ich weiß, über: Grenzfälle im Auge zu Behalten. Teil 1 – Text.
href="http://www.unicode.org/faq/" >Das Unicode-FAQ ist auch lustig zu Lesen. Hier ist Warum gibt es keine eindeutige groß-Charakter . . .
InformationsquelleAutor Mike Sherrill 'Cat Recall'
Können Sie
ILIKE
. alsoDas wird funktionieren, aber mit der langsamen Reaktion. Erhalten Sie schnellen Zugriff auf die Tabellen auf der Grundlage der Ergebnisse der Berechnungen, empfehle ich den
lower
Funktion. Mehr sehen detailsgrundsätzlich kommt es darauf an, ob Sie suchen für die Ergebnisse im Gegensatz zu filtern bekannt - Werte. Im letzteren Fall, ein einheitlicher Fall beibehalten werden sollte bei der Daten-Ebene, damit den Gleichheits-operator zu arbeiten. [Persönliche Empfehlung ist Ober-pascal case für Typ code-Werte]
InformationsquelleAutor ADJ
Können Sie auch Lesen, auf den
ILIKE
Schlüsselwort. Es kann sehr nützlich sein in Zeiten, wenn es nicht konform zum SQL-standard. Weitere Informationen finden Sie hier: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlemail ILIKE 'user-input-email-here'
, stellen Sie sicher, dass die Flucht der Benutzereingaben. Sonst können die Menschen das eingeben von Zeichen wie % , match nichts.Hi. Gut gesagt. Aber ich möchte Sie bitten, wenn ich
ILIKE
undprepared statements
wird dieser Schutz von mir aussql injection
?Nicht sicher, ich vermute, Sie möchten, senden Sie eine escape-Zeichenfolge, um die vorbereitete Anweisung.
"Das entscheidende Wort, ILIKE kann anstelle von verwendet werden, um die übereinstimmung von groß-und Kleinschreibung gemäß der aktiven locale. Dies ist nicht im SQL-standard, sondern ist eine PostgreSQL-Erweiterung." Funktioniert wie ein Zauber in 9.3
ILIKE ist langsamer als
lower(column_name) like %expression%
.InformationsquelleAutor Priidu Neemre
Konnte man auch mit regulären POSIX-Ausdrücken, wie
SELECT 'asd' ~* 'AsD'
zurückt
Fein, aber wie man mit regexp_matches() zum Beispiel ?
die Verwendung von ~* Auswirkungen auf Leistung ?
InformationsquelleAutor James Brown
Mit
~*
können sich stark verbessern, die Leistung und die Funktionalität des INSTR.Rückgabe von Zeilen, die mit Namen, enthält ODER ist gleich um 'adm'.
InformationsquelleAutor Robin Goh