Ich liebe die neuen JSON-Funktionen in MySQL 5.7, laufe aber in einen Block, der versucht, Werte aus JSON in eine normale Tabellenstruktur zusammenzuführen.
Das Ergreifen von JSON, das Manipulieren und Extrahieren von Arrays usw. ist einfach. JSON_EXTRACT den ganzen Weg. Aber was ist mit der Umkehrung, von einem JSON-Array zu Zeilen? Vielleicht bin ich bei der bestehenden MySQL-JSON-Funktionalität dicht, aber ich konnte das nicht herausfinden.
Nehmen wir zum Beispiel an, ich habe ein JSON-Array und möchte für jedes Element im Array eine Zeile mit seinem Wert einfügen? Der einzige Weg, den ich gefunden habe, ist, einen Haufen JSON_EXTRACT (... '$ [0]') JSON_EXTRACT (... '$ [1]') usw. zu schreiben und sie zusammenzufügen.
Oder, sagen wir, ich habe ein JSON-Array und möchte GROUP_CONCAT () in eine einzelne durch Komma getrennte Zeichenfolge?
Mit anderen Worten, ich weiß, dass ich das tun kann:
%Vor%Aber das tut meinen Augen weh. Und mein Herz.
Wie kann ich etwas tun wie:
%Vor%... und lassen Sie die Werte im Array gegen das JSON-Array selbst verketten?
Ich denke, ich suche hier eine Art JSON_SPLIT nach:
%Vor%Wenn MySQL eine korrekte STRING_SPLIT (val, 'separator') - Tabelle hatte, die die Funktion zurückgibt, könnte ich es hacken (Flucht ist verdammt), aber das ist auch nicht verfügbar.
Es ist wahr, dass es keine gute Idee ist, in JSON zu denormalisieren, aber manchmal müssen Sie mit JSON-Daten umgehen, und es gibt eine Möglichkeit, ein JSON-Array in Zeilen in einer Abfrage zu extrahieren.
Der Trick besteht darin, einen Join in einer temporären oder Inline-Tabelle von Indizes durchzuführen, die Ihnen eine Zeile für jeden Nicht-Null-Wert in einem JSON-Array liefert. Das heißt, wenn Sie eine Tabelle mit den Werten 0, 1 und 2 haben, die Sie einem JSON-Array "Fisch" mit zwei Einträgen hinzufügen, entspricht Fisch [0] 0, was zu einer Zeile führt, und Fisch [1] entspricht 1. Dies führt zu einer zweiten Zeile, aber Fisch [2] ist Null, also stimmt es nicht mit der 2 überein und erzeugt keine Zeile in der Verknüpfung. Sie benötigen so viele Zahlen in der Indextabelle wie die maximale Länge eines Arrays in Ihren JSON-Daten. Es ist ein bisschen ein Hack, und es ist ungefähr so schmerzhaft wie das Beispiel des OP, aber es ist sehr praktisch.
Beispiel (erfordert MySQL 5.7.8 oder höher):
%Vor%Das Ergebnis ist:
%Vor%Es sieht so aus, als ob das MySQL-Team eine JSON_TABLE-Funktion in MySQL 8 hinzufügen könnte, um das alles einfacher zu machen. ( Ссылка )
In meinem Fall war JSON
Function nicht verfügbar, also habe ich einen Hack benutzt.
Wie von Chris MYSQL erwähnt, fehlt STRING_SPLIT
, aber substring_index
.
Für die Eingabe
%Vor%Sie können verwenden:
%Vor%Die Ausgabe ist:
%Vor%Sie können entsprechend Ihrer Anforderung ändern.
Ich habe in einem Bericht gearbeitet, in dem es eine große json-Array-Liste in einer Spalte gab. Ich änderte das Datamodell, um die Beziehung 1 zu * zu speichern, anstatt alles in einer einzelnen Spalte zu speichern. Für diesen Prozess musste ich eine Weile in einer gespeicherten Prozedur verwenden, da ich die maximale Größe nicht kenne:
%Vor%