Wie verwenden Sie Kleinbuchstaben Funktion in Postgres Sequelize
Ich versuche, verwenden Sie die Kleinbuchstaben-Funktion für die string-Suche in Sequelize.
Ich Schaffe das nicht mit dem ilike.
Meine Frage ist, wie die Kleinschreibung in diesem Szenario funktionieren?
Den findAll
mit ilike ist wie folgt:
Db.models.Person.findAll(where: {firstName: {$ilike: `somename`}});
Wie kann ich es ändern zu lower(firstname) = lower('somename');
- weiß nicht, ob das auf Sie zutreffen, aber in meinem Fall versuche ich mit unaccent Funktion in C# linq und konnte nicht damit es funktioniert, am Ende nur eine neue Spalte erstellen
u_column
und verwenden postgres-Funktion, um ihn zu füllen. Nicht preatty, sondern Arbeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
PostgreSQL verwendet in der Regel groß- /Kleinschreibung Sortierungen. Dies bedeutet, Daten, die erscheint in jeder Spalte verglichen wird buchstäblich gegen Ihre Abfrage.
Haben Sie mehrere Möglichkeiten:
1. Folgen Sie Ben ' s Antwort, und wickeln Sie den wrap-Spalten und die Datenbank in eine
sequelize.fn('lower')
nennen.Vorteile: Keine änderungen an der Datenbank.
Nachteile: Sie müssen sich daran zu erinnern, um es für jede Abfrage. Verzichtet auf Indizes (es sei denn, Sie haben bereits eine functional index) und scannt Tabellen nacheinander, in Folge langsamer look-ups mit großen Tabellen. Sehr ausführlichen code.
2. Verwenden ILIKE, zu Fall-unempfindlich die mit einem Muster übereinstimmen
Finden Sie den Namen genau:
Db.models.Person.findAll(where: {firstName: {$iLike: 'name'}});
Finden Sie eine fragment, die enthalten sein kann in beliebige Zeichen:
Db.models.Person.findAll(where: {firstName: {$iLike: '%name%'}});
Vorteile: Leicht zu merken. Keine Sequelize-Funktion-Wrapper - es ist ein built-in-operators, also die syntax ist übersichtlicher. Keine spezielle Indizes oder änderungen an der Datenbank erforderlich.
Nachteile: Langsam, es sei denn, Sie starten, messing mit Erweiterungen wie pg_trgm
3. Definieren Sie Ihre text-Spalten mit der citext Art, die implizit vergleicht Kleinbuchstaben
Definition Ihrer Spalte Arten als "citext' (statt
text
odercharacter varying
) hat den gleichen praktischen Effekt, der aus dieser:select * from people where name = 'DAVID'
zu diesem...
select * from people where LOWER(name) = LOWER('DAVID')
Die PostgreSQL-Dokumentation zeigt dies als Beispiel, wie man erstellen Sie Ihre Tabelle mit den citext-Typ:
TL;DR im Grunde tauschen Sie Ihre "text" - Spalten für "citext".
Den citext-Modul kommt zusammen mit dem PostgreSQL-8.4, so gibt es keine Notwendigkeit zu installieren, keine extensions. Aber Sie tun müssen, um es zu aktivieren, auf jede Datenbank, die Sie verwenden Sie es mit dem folgenden SQL:
CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;
Und dann in Ihre Sequelize Definitionen, definieren Sie eine
type
Attribut:Dann Ihre Suchvorgänge in dieser Spalte wird immer case-insensitive sein mit regelmäßigen
where =
AbfragenVorteile: Keine Notwendigkeit, wickeln Sie Ihre Abfragen in hässlichen
sequelize.fn
Anrufe. Keine Notwendigkeit zu erinnern, um explizit Kleinbuchstaben. Gebietsschema wissen, so läuft das in allen Zeichensätzen.Nachteile: Sie müssen sich daran zu erinnern, es zu benutzen in Ihrem Sequelize Definitionen bei der ersten Definition Ihrer Tabelle. Immer aktiviert - Sie müssen wissen, dass Sie wollen, zu tun, die groß /Kleinschreibung bei der Suche bei der Definition der Tabellen.
name
wenn es kommt von einem user.Können Sie native Funktionen, die in der where-Klausel:
was zu übersetzen, um
where: {}
Objekt.where: { sequelize.where(sequelize.fn('lower', sequelize.col('firstname')), sequelize.fn('lower', 'somename')), phoneNumber: 8435551212 }
where: {phoneNumber: '8435551212', $col: sequelize.where(sequelize.fn('lower', sequelize.col('firstname')), sequelize.fn('lower', 'somename'))}