Używając JSON z SQL Server, możesz użyć JSON_QUERY()
funkcja do wyodrębnienia obiektu lub tablicy z ciągu JSON.
Aby użyć tej funkcji, podaj wyrażenie JSON jako argument. Możesz również podać drugi (opcjonalny) argument, aby określić obiekt lub tablicę do wyodrębnienia.
Składnia
Składnia wygląda tak:
JSON_QUERY ( expression [ , path ] )
Gdzie expression
jest wyrażeniem ciągu JSON, a path
jest obiektem lub tablicą, którą chcesz wyodrębnić z tego wyrażenia. path
argument jest opcjonalny (jeśli go nie podasz, zwracany jest cały dokument JSON).
Argument ścieżki (jeśli jest podany) może zawierać opcjonalny tryb ścieżki składnik. Ten opcjonalny tryb ścieżki może mieć wartość lax
lub strict
. Ta wartość określa, co się stanie, jeśli podana ścieżka jest nieprawidłowa. Tryb ścieżki (jeśli jest dostępny) pojawia się przed znakiem dolara.
Przykład 1 – Podstawowe użycie
Oto przykład demonstrujący podstawowe użycie JSON_QUERY()
funkcja.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';
Wynik:
+----------+ | Result | |----------| | { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
W tym przykładzie najpierw deklaruję i ustawiam zmienną o nazwie @data
. Następnie przypisuję do tej zmiennej tablicę. Gdy to zrobię, uruchamiam zapytanie w tej tablicy.
W tym przypadku używam Cities[0]
aby odwołać się do pierwszego elementu w tablicy (tablice JSON używają numeracji od zera).
Mogłem uzyskać dostęp do drugiego elementu za pomocą Cities[1]
. Tak:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';
Wynik:
+----------+ | Result | |----------| | { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } | +----------+
Przykład 2 – Zwróć całe wyrażenie JSON
Drugi argument jest opcjonalny, więc jeśli go pominiesz, zwrócony zostanie cały dokument JSON. Oto, co się dzieje, gdy robimy to przy użyciu tych samych danych z poprzednich przykładów:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data) AS 'Result';
Wynik:
+----------+ | Result | |----------| | { "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] } | +----------+
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_QUERY(Document,'$.Cities[0]') AS 'City 1' FROM Json_Documents
Wynik:
+----------+ | City 1 | |----------| | { "ID": 1, "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
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 – Wartości skalarne
JSON_QUERY()
funkcja nie jest przeznaczona do zwracania wartości skalarnych. Jeśli chcesz zwrócić wartość skalarną, użyj JSON_VALUE()
zamiast tego.
Jednak nic nie stoi na przeszkodzie, aby połączyć obie funkcje w zapytaniu, aby zwrócić dane na różnych poziomach szczegółowości.
Oto przykład:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Wynik:
+---------------+----------------------------------------+--------------+ | Name | Hobbies | Last Hobby | |---------------+----------------------------------------+--------------| | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+----------------------------------------+--------------+
W tym przykładzie użyłem JSON_VALUE()
do wyodrębniania różnych wartości skalarnych, ale użyłem także JSON_QUERY()
aby zwrócić całą tablicę (która JSON_VALUE()
nie mogę tego zrobić).
Przykład 5 – 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_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
Wynik:
+----------+ | Result | |----------| | NULL | +----------+
W tym przykładzie próbujemy zwrócić wartość skalarną, ale JSON_QUERY()
nie robi wartości skalarnych. Jak wspomniano, zwraca tylko obiekty i tablice. 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_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
Wynik:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.
Zgodnie z oczekiwaniami, tryb ścisły powoduje wyświetlenie komunikatu o błędzie z wyjaśnieniem błędu.