Ich habe eine MySQL-Datenbank, die eine Tabelle mit Buchdaten enthält. Eine der Spalten in der Tabelle heißt "Titel". Einige der Titel beginnen mit dem Wort "the" und manche nicht.
Beispiel:
Ich muss diese in alphabetischer Reihenfolge aus der Datenbank ziehen, aber ich muss das "das" am Anfang der Titel ignorieren, die damit beginnen.
Bietet SQL (speziell MySQL) eine Möglichkeit, dies in der Abfrage zu tun?
tue einen Fall, in dem überprüft werden soll, ob der Spaltenwert mit dem beginnt, und wenn dies der Fall ist, gib den Titel ohne das 'The' zurück. Dies ist eine neue Spalte, die Sie später für die Sortierreihenfolge verwenden werden
%Vor% Sie können eine CASE
-Anweisung in ORDER BY
und die Verwendung REGEXP
oder LIKE
verwenden, um Strings zu finden, die mit Wörtern beginnen, die Sie entfernen möchten.
Im folgenden Beispiel finden Sie alle Wörter, die mit a , ein oder das gefolgt von einem Leerzeichen beginnen, und entfernen dann alles bis zum Leerzeichen, und entfernen Sie zusätzlichen Leerraum (Sie haben möglicherweise zwei oder Leerzeichen nach einer Instanz von das ).
%Vor%Wenn Sie sicher sind, dass Sie NIEMALS einen Tippfehler haben werden (und Kleinbuchstaben anstelle von Großbuchstaben verwenden)
%Vor%Sonst macht Ihre Sortierung alle oberen und dann alle unteren.
zum Beispiel ist dies eine aufsteigende Reihenfolge:
%Vor%aus der AJP-Antwort übernommen
Ich habe hier ein paar verworrene Antworten gesehen, die ich ausprobiert habe, die aber nur falsch waren (nicht funktionierten) oder unsicher waren (ersetzt jedes Vorkommen von "das"). Die Lösung, die ich für einfach halte, oder vielleicht bekomme ich es falsch oder beziehe keine Randfälle (aufrichtig, kein Sarkasmus beabsichtigt).
%Vor% Wie bereits an anderer Stelle erwähnt, verhindert UPPER
nur die ASCII-Sortierung, die B vor a anordnet (beachten Sie die Falldifferenz).
Es gibt keine Notwendigkeit für eine switch-case
-Anweisung, wenn es nur eine Bedingung gibt, IF()
wird es tun
Ich benutze MySQL 5.6 und es scheint, als ob die String-Funktionen 1-indexiert sind, im Gegensatz zu PHP, wo Strings 0-indexiert sind (das hat mich erwischt). Ich habe das oben auf meinem Dataset getestet und es funktioniert
Wir verwenden die Funktion IF
, um das "The" (falls vorhanden) vom Anfang der Zeichenfolge zu entfernen, bevor die Zeichenfolge an die ORDER BY
-Klausel zurückgegeben wird. Für komplexere Alphabetisierungsregeln könnten wir eine benutzerdefinierte Funktion erstellen und diese stattdessen in der ORDER BY
-Klausel platzieren. Dann hätten Sie ...ORDER BY MyFunction(Title)
.
Tags und Links mysql