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.