sql >> Database >  >> RDS >> Mysql

MySQL zoek json-waarde op sleutel in array

Je bedoelt in wezen selectie en projectie naar de array-elementen en objectvelden van uw JSON-document. Je moet zoiets doen als een WHERE-component om een ​​"rij" in de array te selecteren, en dan iets doen zoals het kiezen van een van de velden (niet degene die je hebt gebruikt in je selectiecriteria).

Deze worden in SQL gedaan met behulp van de WHERE-clausule en de SELECT-lijst met kolommen, maar hetzelfde doen met JSON is niet iets dat u gemakkelijk kunt doen met functies zoals JSON_SEARCH() en JSON_CONTAINS().

De oplossing die MySQL 8.0 biedt, is de JSON_TABLE() functie om een ​​JSON-document om te zetten in een virtuele afgeleide tabel, alsof u conventionele rijen en kolommen heeft gedefinieerd. Het werkt als de JSON de indeling heeft die u beschrijft, een array van objecten.

Hier is een demo die ik heb gedaan door uw voorbeeldgegevens in een tabel in te voegen:

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 |
+--------+----------+

Nu kunt u dingen doen die u normaal doet met SELECT-query's, zoals selectie en projectie:

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 |
+----------+

Dit heeft een aantal problemen:

  1. Je moet dit elke keer doen u bevraagt ​​de JSON-gegevens, of maakt anders een VIEW om dit te doen.

  2. U zei dat u de attribuutvelden niet kent, maar om een ​​JSON_TABLE()-query te schrijven, moet u de attributen specificeren die u wilt doorzoeken en projecteren in uw query. Je kunt dit niet gebruiken voor totaal ongedefinieerde gegevens.

Ik heb een flink aantal vergelijkbare vragen beantwoord over het gebruik van JSON in MySQL. Ik heb gemerkt dat wanneer je dit soort dingen wilt doen, een JSON-document als een tabel behandelen, zodat je een voorwaarde in de WHERE-component kunt toepassen op velden in je JSON-gegevens, al je vragen een stuk moeilijker worden. Dan krijg je het gevoel dat je beter een paar minuten had kunnen besteden aan het definiëren van je kenmerken, zodat je eenvoudigere zoekopdrachten kunt schrijven.



  1. Voeg een tabel en een wijzigingslogboek samen in een weergave in PostgreSQL

  2. Is er een equivalent voor @@error van SQL Server in MySQL?

  3. Ampersand-operator (&) in een SQL Server WHERE-clausule

  4. Webinar:bijhouden van queryvoortgang in SQL Server