MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs JSON_QUERY():jaka jest różnica?

W MariaDB JSON_VALUE() funkcja i JSON_QUERY() funkcja robi podobne rzeczy – zwraca dane z dokumentu JSON.

Więc jaka jest różnica?

Główna różnica polega na tym, że JSON_VALUE() zwraca wartości skalarne, natomiast JSON_QUERY() zwraca tablice i obiekty.

Definicje

Biorąc pod uwagę dokument JSON, każda funkcja wykonuje następujące czynności:

  • JSON_VALUE() zwraca skalar określony przez ścieżkę.
  • JSON_QUERY() zwraca obiekt lub tablicę określoną przez ścieżkę.

Rozumiem, że działa to w ten sposób ze względu na standard SQL.

Jeśli powoduje to problemy, możesz znaleźć JSON_EXTRACT() funkcja bardziej użyteczna.

Skalary

Oto przykład pokazujący, co się dzieje, gdy próbujemy użyć obu funkcji do wyodrębnienia wartości skalarnej z dokumentu JSON.

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;

Wynik:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Rufus      | NULL       |
+------------+------------+

JSON_VALUE() zwrócił skalar zgodnie z oczekiwaniami, ale JSON_QUERY() zwrócono NULL . Jest to oczekiwane, ponieważ JSON_QUERY() zwraca tylko tablice i obiekty.

To ten sam wynik, jeśli spróbujemy zwrócić dane skalarne z tablicy:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;

Wynik:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Top Dog    | NULL       |
+------------+------------+

Obiekty

Oto, co się dzieje, gdy próbujemy użyć obu funkcji do zwrócenia całego obiektu:

SET @json_document = '{ "name" : "Rufus" }';

SELECT 
    JSON_VALUE(@json_document, '$') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$') AS JSON_QUERY;

Wynik:

+------------+----------------------+
| JSON_VALUE | JSON_QUERY           |
+------------+----------------------+
| NULL       | { "name" : "Rufus" } |
+------------+----------------------+

Tym razem jest to JSON_QUERY() funkcja, która się powiedzie.

Tablice

Oto, co się dzieje, gdy próbujemy użyć obu funkcji do zwrócenia całej tablicy:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;

Wynik:

+------------+------------------------------------------+
| JSON_VALUE | JSON_QUERY                               |
+------------+------------------------------------------+
| NULL       | [ "Top Dog", "Best Dog", "Biggest Dog" ] |
+------------+------------------------------------------+

Ponownie, JSON_QUERY() funkcja się powiedzie.

Jednak żadna funkcja nie powiedzie się, gdy użyjemy operatora wieloznacznego tablicy do wybrania wszystkich elementów skalarnych z tablicy. W tym przypadku JSON_EXTRACT() przychodzi na ratunek:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
    JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;

Wynik:

+------------+------------+----------------------------------------+
| JSON_VALUE | JSON_QUERY | JSON_EXTRACT                           |
+------------+------------+----------------------------------------+
| Top Dog    | NULL       | ["Top Dog", "Best Dog", "Biggest Dog"] |
+------------+------------+----------------------------------------+

Jeśli jednak elementy tablicy są tablicami lub obiektami, wtedy JSON_QUERY() zwraca je dobrze:

SET @json_document = '
    { 
        "name" : "Rufus",
        "scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;

Wynik:

+------------+------------------------------------+
| JSON_VALUE | JSON_QUERY                         |
+------------+------------------------------------+
| NULL       | [ [1, 2, 3], [8, 9], { "a" : 1 } ] |
+------------+------------------------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy na sterownik MariaDB JDBC występuje luka Log4j?

  2. Ustawienia daty i godziny dostępne w MariaDB

  3. Eksplorowanie opcji silnika pamięci masowej dla MariaDB

  4. Jak przeprowadzić migrację bazy danych WHMCS do klastra MariaDB Galera

  5. Jak działa POKAŻ ZESTAW ZNAKÓW w MariaDB