Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL sucht JSON-Wert nach Schlüssel im Array

Sie wollen im Wesentlichen Auswahl und Projektion anwenden zu den Array-Elementen und Objektfeldern Ihres JSON-Dokuments. Sie müssen so etwas wie eine WHERE-Klausel tun, um eine "Zeile" innerhalb des Arrays auszuwählen, und dann so etwas tun, wie eines der Felder auszuwählen (nicht das, das Sie in Ihren Auswahlkriterien verwendet haben).

Dies geschieht in SQL unter Verwendung der WHERE-Klausel und der SELECT-Liste von Spalten, aber dasselbe mit JSON zu tun, ist etwas, das Sie mit Funktionen wie JSON_SEARCH() und JSON_CONTAINS() nicht so einfach tun können.

Die Lösung, die MySQL 8.0 bietet, ist JSON_TABLE() Funktion, um ein JSON-Dokument in eine virtuelle abgeleitete Tabelle umzuwandeln – als ob Sie herkömmliche Zeilen und Spalten definiert hätten. Es funktioniert, wenn der JSON das von Ihnen beschriebene Format hat, ein Array von Objekten.

Hier ist eine Demo, die ich gemacht habe, indem ich Ihre Beispieldaten in eine Tabelle eingefügt habe:

create table mytable ( mycol json );

insert into mytable set mycol = '[{"Race": "Orc", "strength": 14}, {"Race": "Knight", "strength": 7}]';

SELECT j.* FROM mytable, JSON_TABLE(mycol, 
  '$[*]' COLUMNS (
    race VARCHAR(10) PATH '$.Race', 
    strength INT PATH '$.strength'
  )
) AS j;
+--------+----------+
| race   | strength |
+--------+----------+
| Orc    |       14 |
| Knight |        7 |
+--------+----------+

Jetzt können Sie Dinge tun, die Sie normalerweise mit SELECT-Abfragen tun, wie Auswahl und Projektion:

SELECT j.strength FROM mytable, JSON_TABLE(mycol, '$[*]' 
  COLUMNS (
    race VARCHAR(10) PATH '$.Race', 
    strength INT PATH '$.strength'
  )
) AS j 
WHERE j.race = 'Orc'
+----------+
| strength |
+----------+
|       14 |
+----------+

Dies hat ein paar Probleme:

  1. Sie müssen dies jedes Mal tun Sie fragen die JSON-Daten ab oder erstellen dafür eine VIEW.

  2. Sie sagten, Sie kennen die Attributfelder nicht, aber um eine JSON_TABLE()-Abfrage zu schreiben, müssen Sie die Attribute angeben, die Sie suchen und in Ihrer Abfrage projizieren möchten. Sie können dies nicht für völlig undefinierte Daten verwenden.

Ich habe eine ganze Reihe ähnlicher Fragen zur Verwendung von JSON in MySQL beantwortet. Ich habe festgestellt, dass alle Ihre Abfragen viel schwieriger werden, wenn Sie so etwas tun möchten und ein JSON-Dokument wie eine Tabelle behandeln, damit Sie die Bedingung in der WHERE-Klausel auf Felder in Ihren JSON-Daten anwenden können. Dann haben Sie das Gefühl, Sie hätten besser ein paar Minuten damit verbracht, Ihre Attribute zu definieren, damit Sie einfachere Abfragen schreiben können.