sql >> Database >  >> RDS >> Sqlserver

JSON_VALUE() Voorbeelden in SQL Server (T-SQL)

Wanneer u JSON met SQL Server gebruikt, kunt u de JSON_VALUE() functie om een ​​scalaire waarde van een JSON-tekenreeks te retourneren.

Om deze functie te gebruiken, geeft u twee argumenten op; de JSON-expressie en de eigenschap die moet worden geëxtraheerd.

Syntaxis

De syntaxis gaat als volgt:

JSON_VALUE ( expression , path )

Waar expression is de JSON-tekenreeksexpressie en path is de eigenschap die u uit die uitdrukking wilt halen.

Het padargument kan een optionele padmodus bevatten onderdeel. Deze optionele padmodus kan een waarde zijn van lax of strict . Deze waarde, indien aanwezig, komt vóór het dollarteken.

Voorbeeld 1 – Basisgebruik

Hier is een voorbeeld om het basisgebruik van de JSON_VALUE() te demonstreren functie.

SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';

Resultaat:

+----------+
| Result   |
|----------|
| Bruce    |
+----------+

In dit voorbeeld:

  • De {"Name": "Bruce"} argument is de JSON-expressie (een kleine, maar nog steeds een geldige JSON-expressie). JSON-expressies bestaan ​​uit een sleutel/waarde-paar. In dit geval, Name is de sleutel, Bruce is de waarde ervan.
  • De $.Name argument is het pad. Dit pad verwijst naar de waarde van de Name sleutel van de JSON-expressie. Dus we kunnen de waarde extraheren door te verwijzen naar de naam van het paar.

Voorbeeld 2 – Arrays

Om een ​​waarde uit een array te extraheren, verwijst u naar de index tussen vierkante haken, gevolgd door de relevante sleutel. Hier is een voorbeeld:

/* 
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';  

Resultaat:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Dus in dit voorbeeld maken we een JSON-array en plaatsen deze in een variabele met de naam @data . Vervolgens voeren we een query uit met behulp van @data als het eerste argument van de JSON_VALUE() functie (dit komt omdat @data bevat de JSON-expressie).

Arrays gebruiken op nul gebaseerde nummering, dus om het eerste item te extraheren, moeten we Cities[0] gebruiken , de tweede Cities[1] , enzovoort.

Voorbeeld 3 – Een databasevoorbeeld

Als we de gegevens uit het vorige voorbeeld in een database zouden plaatsen, zouden we de query als volgt kunnen herschrijven:

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

Resultaat:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Dit veronderstelt dat het JSON-document is opgeslagen in een kolom met de naam Document , die zich in een tabel bevindt met de naam Json_Documents .

Voorbeeld 4 – Padmodus

Zoals vermeld, hebt u ook de mogelijkheid om de padmodus op te geven. Dit kan ofwel lax . zijn of strict .

De waarde van de padmodus bepaalt wat er gebeurt als de padexpressie een fout bevat. Specifiek:

  • In lax modus, retourneert de functie lege waarden als de padexpressie een fout bevat. Als u bijvoorbeeld de waarde $.name . aanvraagt , en de JSON-tekst bevat geen naam key, de functie retourneert null, maar geeft geen fout.
  • In strikt modus genereert de functie een fout als de paduitdrukking een fout bevat.

De standaardwaarde is lax .

Hier is een voorbeeld om het verschil tussen deze twee modi te demonstreren.

Fout in lakse modus

Dit is wat er gebeurt als de path-expressie een fout bevat in de lax-modus.

SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';

Resultaat:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

In dit voorbeeld proberen we te verwijzen naar Hobbies , maar die sleutel bestaat niet in het JSON-document. In dit geval krijgen we een null-waarde (omdat we de lax-modus gebruiken).

Fout in strikte modus

Dit is wat er gebeurt als we dezelfde code in de strikte modus uitvoeren.

SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';

Resultaat:

Msg 13608, Level 16, State 1, Line 1
Property cannot be found on the specified JSON path.

Zoals verwacht resulteert de strikte modus in een foutmelding die wordt weergegeven.

Voorbeeld 5 – Objecten en arrays retourneren

De JSON_VALUE() functie retourneert geen objecten en arrays. Als u een object of een array wilt retourneren, gebruikt u de JSON_QUERY() in plaats daarvan functioneren. Hier is een voorbeeld waarbij ik beide functies binnen een query gebruik.

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';

Resultaat:

+---------------+-----------+----------------------------------------+--------------+
| Name          | Country   | Hobbies                                | Last Hobby   |
|---------------+-----------+----------------------------------------+--------------|
| Homer Simpson | Thailand  | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
+---------------+-----------+----------------------------------------+--------------+

In dit geval gebruik ik JSON_VALUE() om verschillende scalaire waarden te retourneren, en JSON_QUERY() om een ​​array terug te geven.

Dus als je een object of een array moet retourneren (inclusief het hele JSON-document), zie JSON_QUERY() Voorbeelden in SQL Server.


  1. Hoe de CREATE VIEW-code voor een weergave in PostgreSQL te zien?

  2. Hoe date_part() werkt in PostgreSQL

  3. Hoe de volgende auto-increment-id in mysql te krijgen

  4. Waarschuwingen en meldingen van SkySQL