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

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

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 przypadku Name jest kluczem, Bruce jest jego wartość.
  • $.Name argument jest ścieżką. Ta ścieżka odwołuje się do wartości Name klucz 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:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sparametryzuj klauzulę SQL IN

  2. CAST() vs TRY_CAST() w SQL Server:jaka jest różnica?

  3. Rozmyte dopasowanie przy użyciu T-SQL

  4. Co to jest serwer SQL?

  5. Jak wygenerować instrukcję Drop Table dla wszystkich tabel w bazie danych — SQL Server / T-SQL Tutorial, część 48