Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

JSON_QUERY() Przykłady w SQL Server (T-SQL)

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:

  • 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.
  • ś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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nowe wydanie:pakiet dostrajania Spotlight 7.1.9

  2. Jak mogę pominąć nawiasy kwadratowe w klauzuli LIKE?

  3. Uruchom SERVERPROPERTY() na połączonym serwerze w SQL Server

  4. Oblicz różnicę czasu między dwoma rzędami

  5. Co zrobić z typem oczekiwania ASYNC NETWORK IO?