W SQLite ->>
operator wyodrębnia podskładnik z dokumentu JSON i zwraca reprezentację SQL tego podskładnika.
->> operator został po raz pierwszy wprowadzony w wersji SQLite 3.38.0 (wydanej 22 lutego 2022).
Składnia
Składnia wygląda tak:
json ->> path
Gdzie json
jest dokumentem JSON i ścieżką
jest ścieżką do podkomponentu, który chcemy z niego wyodrębnić.
Podajemy więc dokument JSON po lewej stronie operatora i określamy ścieżkę, którą chcemy wyodrębnić po jego prawej stronie.
->> operator zawsze zwraca reprezentację SQL określonego podkomponentu. Aby zwrócić reprezentację JSON, użyj
->
zamiast tego operatora.
Przykłady
Oto prosty przykład pokazujący, jak ->>
operator pracuje:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';
Wynik:
{"name":"Wag","type":"Dog"}
W tym przypadku określiłem ścieżkę '$'
który zwraca cały dokument.
Określmy inną ścieżkę:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Wynik:
Dog
Możemy również całkowicie pominąć znak dolara i kropkę, w ten sposób:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';
Wynik:
Dog
Tutaj jest z większym dokumentem JSON:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0]';
Wynik:
{"user":"Spike","age":30,"scores":[9,7,3]}
W SQLite tablice są oparte na zerach, więc określanie [0]
zwraca pierwszy element tablicy.
Gdybyśmy chcieli tylko uzyskać wyniki tego użytkownika, moglibyśmy to zrobić:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores';
Wynik:
[9,7,3]
Możemy wejść jeszcze głębiej i wyodrębnić konkretną partyturę:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores[1]';
Wynik:
7
Nieistniejąca ścieżka
Jeśli ścieżka nie istnieje w JSON, zwracana jest wartość null:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';
Wynik:
null
Zauważ, że w SQLite możesz użyć .nullvalue
aby określić ciąg do wyprowadzania, gdy zwrócona zostanie wartość null. W moim przypadku wcześniej uruchomiłem następujące polecenie:
.nullvalue null
Oznacza to, że tekst null
powinna być wypisywana zawsze, gdy zwracana jest wartość null. Dlatego powyższy przykład wyświetla tekst null
. Gdybym tego nie zrobił, wynik mógłby być pusty.
Nieprawidłowy JSON
Jeśli pierwszy argument nie jest prawidłowym JSON, zgłaszany jest błąd:
SELECT '{ "name" }' ->> '$';
Wynik:
Runtime error: malformed JSON
Nieprawidłowa ścieżka
A jeśli drugi argument nie jest prawidłową ścieżką, zgłaszany jest błąd:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';
Wynik:
Runtime error: JSON path error near 'name'
W tym przypadku zapomniałem podać kropkę (.
) między znakiem dolara ($
) i nazwa
.
Jak jednak wspomniano, możliwe jest całkowite pominięcie znaku dolara i kropki:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';
Wynik:
Wag