SQLite
 sql >> Baza danych >  >> RDS >> SQLite

SQLite JSON_EXTRACT()

W SQLite json_extract() funkcja wyodrębnia i zwraca jedną lub więcej wartości z dobrze sformatowanego JSON.

Gdy wywołujemy funkcję, przekazujemy JSON jako argument, który zwraca odpowiednią wartość/wartości.

Możemy określić jedną lub więcej ścieżek do wyodrębnienia z dokumentu JSON.

Składnia

Składnia wygląda tak:

json_extract(X,P1,P2,...)

Gdzie X reprezentuje dokument JSON, a P1,P2,... to ścieżki, których możemy użyć do wyodrębnienia określonych części dokumentu JSON.

Przykłady

Oto podstawowy przykład do zademonstrowania:

SELECT json_extract('{ "a" : 1 }', '$');

Wynik:

{"a":1}

Tutaj określiłem ścieżkę $ , który zwraca cały dokument JSON.

Oto przykład z większym dokumentem JSON:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$'
);

Wynik:

{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}

Zmieńmy ścieżkę tak, że zwracamy tylko dogs tablica:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs'
);

Wynik:

[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]

Wybierzmy jeden z elementów tablicy:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Wynik:

{"name":"Bark","scores":[3,4,8,7]}

Tablice są oparte na zerach, więc licznik zaczyna się od 0 . Dlatego określiliśmy [1] aby uzyskać drugi element w dogs tablica, która akurat jest obiektem JSON.

Zejdźmy jeszcze głębiej i zwróćmy tylko imię psa na tej pozycji w tablicy:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Wynik:

Bark

Określ wiele ścieżek

json_extract() funkcja pozwala nam wybrać wiele ścieżek:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Wynik:

["Wag","Bark","Woof"]

W tym przypadku zwróciłem imiona wszystkich psów w dogs tablica.

Wszystkie imiona psów są zwracane w tablicy.

Wybieranie nieistniejącej ścieżki

Jeśli wskażemy ścieżkę, która nie istnieje, null jest zwracany.

Najpierw ustawmy .nullvalue na NULL :

.nullvalue NULL

.nullvalue Polecenie kropka pozwala nam dostarczyć ciąg znaków, który zostanie użyty do zastąpienia wartości null. Jest to jeden z kilku sposobów zastępowania wartości null ciągiem w SQLite. W tym przypadku ustawiłem go na NULL . Teraz wszystkie wartości null zwrócą NULL zamiast pustego wyniku.

Teraz wywołajmy json_extract() , ale użyj drugiego argumentu, który wskazuje na nieistniejącą ścieżkę:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.cats'
);

Wynik:

NULL

Nieprawidłowe ścieżki

Otrzymamy błąd, jeśli nasza ścieżka nie jest dobrze uformowana:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'dogs'
);

Wynik:

Runtime error: JSON path error near 'dogs'

W tym przypadku zapomniałem dołączyć $. z przodu ścieżki.

Nieprawidłowe dokumenty JSON

Otrzymamy również błąd, że JSON nie jest poprawnie sformułowany:

SELECT json_extract('{ "Dogs" : }', 
'$'
);

Wynik:

Runtime error: malformed JSON

Tym razem błąd mówi nam, że nasz JSON jest zniekształcony.

Typy zwrotów

Dokumentacja SQLite stwierdza, co następuje:

Jeśli podano tylko jedną ścieżkę P1, wtedy typem danych SQL wyniku jest NULL dla wartości JSON null, INTEGER lub REAL dla wartości liczbowej JSON, INTEGER zero dla fałszywej wartości JSON, INTEGER jedynki dla prawdziwej wartości JSON, tekst bez cudzysłowów dla wartości ciągu JSON oraz reprezentacja tekstowa dla wartości obiektu i tablicy JSON. Jeśli istnieje wiele argumentów ścieżki (P1, P2 itd.), ta procedura zwraca tekst SQLite, który jest dobrze uformowaną tablicą JSON zawierającą różne wartości.

Kompatybilność z MySQL

Dokumentacja SQLite ostrzega nas również o subtelnej niezgodności między implementacjami SQLite i MySQL funkcji json_extract() funkcja.

W szczególności stwierdza:

Wersja MySQL funkcji json_extract() zawsze zwraca JSON. Wersja SQLite funkcji json_extract() zwraca JSON tylko wtedy, gdy istnieją dwa lub więcej argumentów PATH (ponieważ wynikiem jest wtedy tablica JSON) lub jeśli pojedynczy argument PATH odwołuje się do tablicy lub obiektu. W SQLite, jeśli json_extract() ma tylko jeden argument PATH i PATH odwołuje się do JSON null, ciągu lub wartości liczbowej, to json_extract() zwraca odpowiednią wartość SQL NULL, TEXT, INTEGER lub REAL.

Zasadniczo ta różnica staje się widoczna dopiero podczas uzyskiwania dostępu do poszczególnych wartości w JSON, które są ciągami lub wartościami NULL.


  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 wpisy bazy danych dodane z pozycji można usunąć przyciskiem?

  2. Jak zaimplementować SQLCipher podczas korzystania z SQLiteOpenHelper

  3. Jak przekonwertować milisekundy do daty w SQLite

  4. Jak filtrować w relacji jeden do wielu z db pokoju Android

  5. Zamów SQLite według