Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL wyszukaj wartość json według klucza w tablicy

Zasadniczo chcesz zastosować wybór i projekcję do elementów tablicy i pól obiektów w dokumencie JSON. Musisz zrobić coś takiego jak klauzula WHERE, aby wybrać „wiersz” w tablicy, a następnie zrobić coś takiego, jak wybranie jednego z pól (nie tego, którego użyłeś w kryteriach wyboru).

Są one wykonywane w SQL przy użyciu klauzuli WHERE i listy kolumn SELECT, ale robienie tego samego z JSON nie jest czymś, co można łatwo zrobić z funkcjami takimi jak JSON_SEARCH() i JSON_CONTAINS().

Rozwiązaniem, które zapewnia MySQL 8.0 jest JSON_TABLE() funkcja przekształcająca dokument JSON w wirtualną tabelę pochodną — tak, jakbyś zdefiniował konwencjonalne wiersze i kolumny. Działa, jeśli JSON ma format, który opisujesz, tablicę obiektów.

Oto demo, które zrobiłem, wstawiając przykładowe dane do tabeli:

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

Teraz możesz robić rzeczy, które normalnie robisz z zapytaniami SELECT, takie jak selekcja i projekcja:

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

To ma kilka problemów:

  1. Musisz to robić za każdym razem wysyłasz zapytanie o dane JSON lub tworzysz WIDOK, aby to zrobić.

  2. Powiedziałeś, że nie znasz pól atrybutów, ale aby napisać zapytanie JSON_TABLE(), musisz określić atrybuty, które chcesz przeszukiwać i projektować w zapytaniu. Nie możesz tego użyć do całkowicie niezdefiniowanych danych.

Odpowiedziałem na wiele podobnych pytań dotyczących używania JSON w MySQL. Zauważyłem, że jeśli chcesz zrobić coś takiego, traktując dokument JSON jak tabelę, aby móc zastosować warunek w klauzuli WHERE do pól w danych JSON, wszystkie twoje zapytania stają się znacznie trudniejsze. Wtedy zaczynasz czuć, że lepiej byłoby poświęcić kilka minut na zdefiniowanie swoich atrybutów, aby móc pisać prostsze zapytania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odkrywanie serwera MySQL Binlog — Ripple

  2. mysql.connector.errors.ProgrammingError:1064 (4200):Wystąpił błąd w składni SQL;

  3. Naprawianie uszkodzonego kodowania UTF-8

  4. Jak wyczyścić ekran w konsoli MySQL?

  5. Operator MINUS w MySQL?