Ich habe ein Tabellenfeld, membername
das sowohl den Nachnamen als auch den Vornamen der Benutzer enthält. Ist es möglich , diese in zwei Felder aufgeteilt memberfirst
, memberlast
?
Alle Datensätze haben das Format "Vorname Nachname" (ohne Anführungszeichen und Leerzeichen dazwischen).
Antworten:
Leider bietet MySQL keine Split-String-Funktion. Sie können hierfür jedoch eine benutzerdefinierte Funktion erstellen , wie die im folgenden Artikel beschriebene:
Mit dieser Funktion:
Sie können Ihre Abfrage wie folgt erstellen:
Wenn Sie keine benutzerdefinierte Funktion verwenden möchten und die Abfrage nicht etwas ausführlicher ist, können Sie auch Folgendes tun:
quelle
LENGTH
Multibyte sicher? "LENGTH (str): Gibt die Länge des Strings str zurück, gemessen in Bytes. Ein Multibyte-Zeichen zählt als mehrere Bytes. Dies bedeutet, dass LENGTH () für einen String mit fünf 2-Byte-Zeichen 10 zurückgibt, während CHAR_LENGTH () zurückgibt 5. "SELECT-Variante (keine benutzerdefinierte Funktion erstellen):
Dieser Ansatz kümmert sich auch um:
Die UPDATE-Version wäre:
quelle
Es scheint, dass bestehende Antworten zu kompliziert oder keine strenge Antwort auf die jeweilige Frage sind.
Ich denke, die einfache Antwort ist die folgende Frage:
Ich denke, es ist in dieser besonderen Situation nicht notwendig, mit Namen mit mehr als zwei Wörtern umzugehen. Wenn Sie es richtig machen möchten, kann das Teilen in einigen Fällen sehr schwierig oder sogar unmöglich sein:
In einer ordnungsgemäß gestalteten Datenbank sollten menschliche Namen sowohl in Teilen als auch als Ganzes gespeichert werden. Dies ist natürlich nicht immer möglich.
quelle
Wenn Ihr Plan ist dies als Teil eines tun Abfrage, bitte nicht tun , dass (a) . Im Ernst, es ist ein Performance-Killer. Es kann Situationen geben, in denen Sie sich nicht für die Leistung interessieren (z. B. einmalige Migrationsjobs zum Aufteilen der Felder, um in Zukunft eine bessere Leistung zu erzielen). Wenn Sie dies jedoch regelmäßig für etwas anderes als eine Mickey-Mouse-Datenbank tun, sind Sie es verschwenden Ressourcen.
Wenn Sie jemals nur einen Teil einer Spalte auf irgendeine Weise verarbeiten müssen, ist Ihr DB-Design fehlerhaft. Es funktioniert möglicherweise einwandfrei in einem Adressbuch oder einer Rezeptanwendung oder in einer Vielzahl anderer kleiner Datenbanken, ist jedoch nicht auf "echte" Systeme skalierbar.
Speichern Sie die Komponenten des Namens in separaten Spalten. Es ist fast immer viel schneller, Spalten mit einer einfachen Verkettung (wenn Sie den vollständigen Namen benötigen) zusammenzufügen, als sie mit einer Zeichensuche aufzuteilen.
Wenn Sie das Feld aus irgendeinem Grund nicht teilen können, fügen Sie zumindest die zusätzlichen Spalten ein und füllen Sie sie mit einem Einfüge- / Aktualisierungsauslöser. Dies ist zwar nicht 3NF, garantiert jedoch, dass die Daten immer noch konsistent sind, und beschleunigt Ihre Abfragen massiv. Sie können auch sicherstellen, dass die zusätzlichen Spalten gleichzeitig in Kleinbuchstaben (und indiziert, wenn Sie danach suchen) angezeigt werden, damit Sie nicht mit Fallproblemen herumspielen müssen.
Wenn Sie nicht einmal die Spalten und Trigger hinzufügen können, beachten Sie (und machen Sie Ihren Client darauf aufmerksam, wenn es sich um einen Client handelt), dass er nicht skalierbar ist.
(a) Wenn Sie beabsichtigen, diese Abfrage zum Korrigieren des Schemas zu verwenden, sodass die Namen in separaten Spalten in der Tabelle und nicht in der Abfrage platziert werden, würde ich dies als gültige Verwendung betrachten. Aber ich wiederhole, es in der Abfrage zu tun, ist keine wirklich gute Idee.
quelle
benutze das
quelle
Ich habe die Frage nicht genau beantwortet, aber mit dem gleichen Problem konfrontiert, dass ich dies getan habe:
quelle
In MySQL funktioniert diese Option:
quelle
Der einzige Fall, in dem Sie eine solche Funktion wünschen, ist eine UPDATE-Abfrage, die Ihre Tabelle so ändert, dass Vorname und Nachname in separaten Feldern gespeichert werden.
Das Datenbankdesign muss bestimmten Regeln folgen, und die Datenbanknormalisierung gehört zu den wichtigsten
quelle
Ich hatte eine Spalte, in der sich Vor- und Nachname in einer Spalte befanden. Der Vor- und Nachname wurden durch ein Komma getrennt. Der folgende Code hat funktioniert. Es erfolgt KEINE Fehlerprüfung / -korrektur. Nur eine blöde Trennung. Verwendet phpMyAdmin, um die SQL-Anweisung auszuführen.
13.2.10 UPDATE-Syntax
quelle
Dies dauert smhg von hier und Curt's von letzten Index eines bestimmten Teilstrings in MySQL und kombiniert sie. Dies ist für MySQL. Alles, was ich brauchte, war eine anständige Aufteilung des Namens in Vorname Nachname mit dem Nachnamen ein einzelnes Wort, der Vorname alles vor diesem einzelnen Wort, wobei der Name null, 1 Wort, 2 Wörter oder sein könnte mehr als 2 Wörter. Dh: Null; Maria; Mary Smith; Mary A. Smith; Mary Sue Ellen Smith;
Wenn der Name also ein Wort oder null ist, ist der Nachname null. Wenn der Name> 1 Wort ist, ist der Nachname das letzte Wort und der Vorname alle Wörter vor dem letzten Wort.
Beachten Sie, dass ich bereits Dinge wie Joe Smith Jr. abgeschnitten habe. Joe Smith Esq. und so weiter, manuell, was natürlich schmerzhaft war, aber es war klein genug, um dies zu tun. Sie sollten also sicherstellen, dass Sie sich die Daten im Namensfeld wirklich ansehen, bevor Sie sich für eine Methode entscheiden.
Beachten Sie, dass dadurch auch das Ergebnis gekürzt wird, sodass Sie keine Leerzeichen vor oder nach den Namen erhalten.
Ich poste dies nur für andere, die sich hierher googeln und nach dem suchen, was ich brauche. Dies funktioniert natürlich, testen Sie es zuerst mit der Auswahl.
Es ist eine einmalige Sache, daher ist mir Effizienz egal.
quelle
Methode Ich habe Vorname in Vorname und Nachname aufgeteilt, als die Daten alle im Feld Vorname ankamen. Dadurch wird nur das Nachwort in das Feld für den Nachnamen eingefügt, sodass "John Phillips Sousa" der Vorname "John Phillips" und der Nachname "Sousa" ist. Außerdem wird vermieden, dass bereits reparierte Datensätze überschrieben werden.
quelle
quelle
MySQL 5.4 bietet eine native Split-Funktion:
quelle