sql >> Databasteknik >  >> RDS >> Mysql

MySQL sök json värde med nyckel i array

Du menar i princip att tillämpa selektion och projektion till arrayelementen och objektfälten i ditt JSON-dokument. Du måste göra något som en WHERE-sats för att välja en "rad" i arrayen, och sedan göra något som att välja ett av fälten (inte det du använde i dina urvalskriterier).

Dessa görs i SQL med hjälp av WHERE-satsen och SELECT-listan med kolumner, men att göra samma sak med JSON är inte något du enkelt kan göra med funktioner som JSON_SEARCH() och JSON_CONTAINS().

Lösningen MySQL 8.0 tillhandahåller är JSON_TABLE() funktion för att förvandla ett JSON-dokument till en virtuell härledd tabell – som om du hade definierat konventionella rader och kolumner. Det fungerar om JSON är i formatet du beskriver, en array av objekt.

Här är en demo som jag gjorde genom att infoga din exempeldata i en tabell:

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 kan du göra saker du normalt gör med SELECT-frågor, som urval och 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 |
+----------+

Detta har ett par problem:

  1. Du måste göra detta varje gång du frågar efter JSON-data, eller skapar en VIEW för att göra det.

  2. Du sa att du inte känner till attributfälten, men för att skriva en JSON_TABLE()-fråga måste du ange de attribut du vill söka i och projicera i din fråga. Du kan inte använda detta för helt odefinierade data.

Jag har svarat på en hel del liknande frågor om att använda JSON i MySQL. Jag har observerat att när du vill göra den här typen av saker, behandla ett JSON-dokument som en tabell så att du kan tillämpa villkor i WHERE-satsen på fält i din JSON-data, då blir alla dina frågor mycket svårare. Sedan börjar du känna att du skulle ha varit bättre att spendera några minuter på att definiera dina attribut så att du kunde skriva enklare frågor.



  1. MariaDB GROUP_CONCAT()

  2. SQL Server AlwaysOn ( Availability Group ) Arkitektur och steg för steg installation -1

  3. Varningar och meddelanden från SkySQL

  4. Skapa en tabell med aritmetiskt spillfel