Schreiben von Abfragen ohne Berücksichtigung der Groß-/Kleinschreibung in PostgreSQL
-
Verwenden Sie
PATTERN MATCHING
in PostgreSQL -
Verwenden Sie die Funktion
LOWER
, um Fälle beim Suchen in PostgreSQL ähnlich zu machen -
die Verwendung von
CASE CONVERSION
in PostgreSQL -
Verwenden Sie
CITEXT
beim Erstellen einer Tabelle, umCASE-INSENSITIVE
-Matching in PostgreSQL durchzuführen
Beim Schreiben einer Abfrage in unserem DBMS
stellen wir oft fest, dass einige Zeichen möglicherweise in Groß- oder Kleinbuchstaben geschrieben werden müssen, abhängig von den Bedingungen, die erforderlich sind, um eine Klausel oder Syntax zu erfüllen. Folglich muss ungeachtet der Umstände ein Verfahren zum Vervollständigen von Abfragen und zum Vermeiden allgemeiner Syntaxfehler gefunden werden.
In diesem Artikel wird erläutert, wie Sie Abfragen ohne Berücksichtigung der Groß-/Kleinschreibung in PostgreSQL schreiben.
Verwenden Sie PATTERN MATCHING
in PostgreSQL
Eine der Möglichkeiten, Abfragen in PostgreSQL zu optimieren, bei denen wir versuchen, etwas in unserer Datenbank zu finden, und es mit einer bestimmten Zeichenfolge versehen müssen, die zusammen mit den enthaltenen Objekten übereinstimmt, müssen wir möglicherweise die gleichen Groß- und Kleinschreibung verwenden, die wir dafür verwendet haben Objekt beim Suchen.
Dies könnte zu Problemen führen, wenn wir die genaue Syntax des Objektnamens vergessen haben, als er früher definiert wurde.
Hier können wir etwas so Einfaches wie PATTERN MATCHING
verwenden. Wir haben eine Tabelle TIER
mit ID
, ALTER
und TYP
.
Die Tabelle enthält bereits folgende Daten:
ID AGE TYPE
1 2 12 "Horse"
2 1 3 "Cat"
3 3 4 "Kitten"
Wir können die folgende Abfrage verwenden, um alle TIERE
mit dem Typ KÄTZCHEN
zu finden.
Anfrage:
select * from ANIMAL where type = 'Kitten';
Ausgang:
Wenn wir jedoch die folgende Abfrage schreiben:
select * from ANIMAL where type = 'kitten';
Dann erhalten wir nichts in unserem Ergebnis, und das passiert, weil das Zeichen 'k'
nicht gleich 'K'
ist. Um dies zu lösen, können wir den ILIKE
-Operator verwenden, um die Groß-/Kleinschreibung zu ignorieren.
Anfrage:
select * from ANIMAL where type ILIKE 'kitten';
Diese Abfrage gibt alle Tiere zurück, die vom Typ KITTEN
sind. Eine Modifikation dieses Codes kann der Zeichenoperator sein, der alternativ mit ILIKE
verwendet werden kann.
Anfrage:
select * from ANIMAL where type ~~* 'kitten';
Eine andere Methode, die wir verwenden können, ist der Operator LIKE
oder SIMILAR TO
, aber sie können nur verwendet werden, wenn wir uns die Teile des Namens mit ihren richtigen Groß- und Kleinschreibung merken.
Um zum Beispiel nach KÄTZCHEN
zu suchen, wenn wir uns erinnern, dass unser Name ITTEN
klein war und K
entweder KLEIN
oder GROS
war, können wir etwas wie folgt schreiben, um das Ergebnis abzufragen.
Anfrage:
select * from ANIMAL where type similar to '%itten';
Dies ist keine gute Alternative und sollte verwendet werden, wenn der Benutzer eine Vorstellung von der beim Erstellen von Objekten verwendeten Namenskonvention hat. ILIKE
bietet eine bessere Handhabung der Groß-/Kleinschreibung, wenn die Muster mit der bereitgestellten Zeichenfolge abgeglichen werden.
Verwenden Sie die Funktion LOWER
, um Fälle beim Suchen in PostgreSQL ähnlich zu machen
Eine sehr effiziente Möglichkeit, ein Muster mit einer Zeichenfolge abzugleichen, besteht darin, die Zeichen in beiden ähnlich zu machen. Entweder indem Sie alle Zeichen in LOWER
oder UPPER
umwandeln und dann entsprechend anpassen.
PostgreSQL stellt uns zur Überprüfung eine Funktion LOWER()
sowie UPPER()
zur Verfügung.
Anfrage:
select * from ANIMAL where lower(type) = lower('kitten')
oder
select * from ANIMAL where lower(type) = lower('kitten')
Ausgang:
In ähnlicher Weise können wir INITCAP
verwenden, um nur den Anfangsbuchstaben unseres Musters und unserer Zeichenfolge groß zu schreiben und den Rest in Kleinbuchstaben, um ihn abzugleichen und zu überprüfen.
Anfrage:
select * from ANIMAL where initcap(type) = initcap('kitten')
die Verwendung von CASE CONVERSION
in PostgreSQL
INDEXES ON EXPRESSIONS
in PostgreSQL beschleunigt die Abfrage von Ergebnissen aus einer großen Tabelle. Anstatt dieselbe Abfrage wiederholt für eine Tabelle aufzurufen, was zu mehr Zeit führt, können wir sie indizieren und dann bei einer Abfrage verwenden.
Denken Sie daran, dass CASE CONVERSIONS
bereits vorhandene INDEXES
ungültig machen können, da sie möglicherweise erneut aktualisiert werden müssen. Wir können die folgenden Abfragen schreiben, um einen Index für dieses CASE MATCHING
zu erstellen.
Anfrage:
create index lower_col on ANIMAL (lower(type));
oder
create index upper_col on ANIMAL (upper(type));
Und analog auch für INITCAP
. Diese INDEXES
können sogar verwendet werden, um Einschränkungen für ROW INSERTION
festzulegen, wo ein Datensatz mit einem anderen CASE
INSERTED
ist und bei Duplizierung ungültig gemacht werden kann.
Um LIKE
- und ILIKE
-Abfragen zu beschleunigen, können wir GIN
- oder GIST
-Indizes mit einer PG_TRGM_EXTENSION
verwenden.
Verwenden Sie CITEXT
beim Erstellen einer Tabelle, um CASE-INSENSITIVE
-Matching in PostgreSQL durchzuführen
Eine weitere Alternative zum üblichen Abgleich in PostgreSQL ist die Verwendung der CITEXT
-Klausel. Es ruft intern LOWER()
auf, wenn Werte verglichen werden, anstatt dass der Benutzer jedes Mal LOWER()
eingibt, wenn er versucht, eine Zeichenfolge mit einem Muster abzugleichen.
Erstellen wir die Tabelle ANIMAL
mit der Spalte TYPE
als CITEXT
.
create extension CITEXT; --creating the extension first
create table ANIMAL(
id INT PRIMARY KEY,
age INT,
TYPE CITEXT
)
Dann EINFÜGEN
Sie dieselben Werte aus der vorherigen Tabelle. Verwenden Sie nun die folgende Abfrage, um ein Ergebnis zurückzugeben.
select * from ANIMAL where type = 'kitten';
Wir können sehen, dass die Verwendung von CITEXT
in unseren Spalten kostengünstiger, effizienter und schneller ist als viele der oben genannten Lösungen. CITEXT
hängt von der LC_CTYPE
-Einstellung der Datenbank ab und kann nach Ihren Bedürfnissen modifiziert werden.
Hier sind einige wichtige Punkte zu den CASE CONVERSIONS
vor dem Matching.
- Fälle können nicht in andere Sprachen konvertiert werden (außer Englisch).
- Die Funktionen
LOWER()
undUPPER()
sind langsamer, da keine Indizierung erfolgt.
Dies sind all die verschiedenen Möglichkeiten, Zeichenfolgen mit Mustern in PostgreSQL zu vergleichen.
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub