Używając JSON z SQL Server, możesz użyć JSON_VALUE() funkcja zwracająca wartość skalarną z ciągu JSON.
Aby użyć tej funkcji, podaj dwa argumenty; wyrażenie JSON i właściwość do wyodrębnienia.
Składnia
Składnia wygląda tak:
JSON_VALUE ( expression , path )
Gdzie expression jest wyrażeniem ciągu JSON, a path to właściwość, którą chcesz wyodrębnić z tego wyrażenia.
Argument ścieżki może zawierać opcjonalny tryb ścieżki składnik. Ten opcjonalny tryb ścieżki może mieć wartość lax lub strict . Ta wartość, jeśli istnieje, znajduje się przed znakiem dolara.
Przykład 1 – Podstawowe użycie
Oto przykład demonstrujący podstawowe użycie JSON_VALUE() funkcja.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Wynik:
+----------+ | Result | |----------| | Bruce | +----------+
W tym przykładzie:
{"Name": "Bruce"}argumentem jest wyrażenie JSON (niewielkie, ale nadal prawidłowe wyrażenie JSON). Wyrażenia JSON składają się z pary klucz/wartość. W takim przypadkuNamejest kluczem,Brucejest jego wartość.$.Nameargument jest ścieżką. Ta ścieżka odwołuje się do wartościNameklucz wyrażenia JSON. Możemy więc wyodrębnić wartość, odwołując się do nazwy pary.
Przykład 2 – Tablice
Aby wyodrębnić wartość z tablicy, odwołaj się do jej indeksu w nawiasach kwadratowych, po których następuje odpowiedni klucz. Oto przykład:
/*
CREATE THE ARRAY (and put into a variable called @data)
*/
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Cities": [
{
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "Qandahar",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
}'
/*
QUERY THE ARRAY
*/
SELECT
JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'
UNION ALL
SELECT
JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
Wynik:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
W tym przykładzie tworzymy tablicę JSON i umieszczamy ją w zmiennej o nazwie @data . Następnie uruchamiamy zapytanie, używając @data jako pierwszy argument funkcji JSON_VALUE() funkcja (to dlatego, że @data zawiera wyrażenie JSON).
Tablice używają numeracji od zera, więc aby wyodrębnić pierwszy element, musimy użyć Cities[0] , drugi Cities[1] i tak dalej.
Przykład 3 – Przykład bazy danych
Gdybyśmy mieli umieścić dane z poprzedniego przykładu w bazie danych, moglibyśmy przepisać zapytanie w następujący sposób:
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
Wynik:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Zakłada się, że dokument JSON jest przechowywany w kolumnie o nazwie Document , który znajduje się w tabeli o nazwie Json_Documents .
Przykład 4 – Tryb ścieżki
Jak wspomniano, masz również możliwość określenia trybu ścieżki. Może to być lax lub strict .
Wartość trybu ścieżki określa, co się stanie, gdy wyrażenie ścieżki zawiera błąd. W szczególności:
- W luzie w trybie, funkcja zwraca puste wartości, jeśli wyrażenie ścieżki zawiera błąd. Na przykład, jeśli poprosisz o wartość $.name , a tekst JSON nie zawiera nazwy klawisz, funkcja zwraca wartość null, ale nie zgłasza błędu.
-
W ściśle w trybie, funkcja zgłasza błąd, jeśli wyrażenie ścieżki zawiera błąd.
Domyślna wartość to lax .
Oto przykład pokazujący różnicę między tymi dwoma trybami.
Błąd w trybie luźnym
Oto, co się dzieje, gdy wyrażenie ścieżki zawiera błąd w trybie poluzowania.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Wynik:
+----------+ | Result | |----------| | NULL | +----------+
W tym przykładzie próbujemy odwołać się do Hobbies , ale ten klucz nie istnieje w dokumencie JSON. W tym przypadku otrzymujemy wartość null (ponieważ używamy trybu lax).
Błąd w trybie ścisłym
Oto, co się dzieje, gdy uruchamiamy ten sam kod w trybie ścisłym.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Wynik:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Zgodnie z oczekiwaniami, tryb ścisły powoduje wyświetlenie komunikatu o błędzie.
Przykład 5 – Zwracanie obiektów i tablic
JSON_VALUE() funkcja nie zwraca obiektów i tablic. Jeśli chcesz zwrócić obiekt lub tablicę, użyj JSON_QUERY() funkcja zamiast. Oto przykład, w którym używam obu funkcji w zapytaniu.
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Mae Sai",
"Province": "Chiang Rai",
"Country": "Thailand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country',
JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Wynik:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
W tym przypadku używam JSON_VALUE() zwracać różne wartości skalarne i JSON_QUERY() aby zwrócić tablicę.
Jeśli więc potrzebujesz zwrócić obiekt lub tablicę (w tym cały dokument JSON), zobacz JSON_QUERY() Przykłady w SQL Server.