sql >> Database >  >> RDS >> Sqlserver

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

Wanneer u JSON gebruikt met SQL Server, kunt u de JSON_QUERY() . gebruiken functie om een ​​object of een array uit een JSON-string te extraheren.

Om deze functie te gebruiken, geeft u de JSON-expressie op als argument. U kunt ook een tweede (optioneel) argument opgeven om het object of de array te specificeren die u wilt extraheren.

Syntaxis

De syntaxis gaat als volgt:

JSON_QUERY ( expression [ , path ] )  

Waar expression is de JSON-tekenreeksexpressie en path is het object of de array die u uit die expressie wilt extraheren. Het path argument is optioneel (als u het niet opgeeft, wordt het hele JSON-document geretourneerd).

Het padargument (indien opgegeven) kan een optionele padmodus bevatten onderdeel. Deze optionele padmodus kan een waarde zijn van lax of strict . Deze waarde bepaalt wat er gebeurt als het opgegeven pad ongeldig is. De padmodus (indien aanwezig) komt voor het dollarteken.

Voorbeeld 1 – Basisgebruik

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

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

Resultaat:

+----------+
| Result   |
|----------|
| {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        }          |
+----------+

In dit voorbeeld declareer en stel ik eerst een variabele in met de naam @data . Ik wijs vervolgens een array toe aan deze variabele. Zodra ik dit heb gedaan, voer ik een query uit op die array.

In dit geval gebruik ik Cities[0] om te verwijzen naar het eerste item in de array (JSON-arrays gebruiken op nul gebaseerde nummering).

Ik kon toegang krijgen tot het tweede item met Cities[1] . Zoals dit:

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

Resultaat:

+----------+
| Result   |
|----------|
| {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }          |
+----------+

Voorbeeld 2 – Retourneer de hele JSON-expressie

Het tweede argument is optioneel, dus als u het weglaat, wordt het hele JSON-document geretourneerd. Dit is wat er gebeurt als we dat doen met dezelfde gegevens uit de vorige voorbeelden:

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

Resultaat:

+----------+
| Result   |
|----------|
| {
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}          |
+----------+

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_QUERY(Document,'$.Cities[0]') AS 'City 1'
FROM Json_Documents

Resultaat:

+----------+
| City 1   |
|----------|
| {
            "ID": 1,
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        }          |
+----------+

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 – Scalaire waarden

De JSON_QUERY() functie is niet ontworpen om scalaire waarden te retourneren. Als u een scalaire waarde wilt retourneren, gebruikt u de JSON_VALUE() functie in plaats daarvan.

Niets houdt u echter tegen om beide functies binnen een query te combineren om gegevens op verschillende granulariteitsniveaus te retourneren.

Hier is een voorbeeld:

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

Resultaat:

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

In dit voorbeeld gebruikte ik JSON_VALUE() om verschillende scalaire waarden te extraheren, maar ik gebruikte ook JSON_QUERY() om een ​​hele array terug te geven (die JSON_VALUE() kan niet).

Voorbeeld 5 – 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_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';

Resultaat:

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

In dit voorbeeld proberen we een scalaire waarde te retourneren, maar JSON_QUERY() doet geen scalaire waarden. Zoals vermeld, retourneert het alleen objecten en arrays. 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_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';

Resultaat:

Msg 13624, Level 16, State 2, Line 1
Object or array cannot be found in the specified JSON path.

Zoals verwacht resulteert de strikte modus in een foutmelding waarin de fout wordt uitgelegd.


  1. JSON_REMOVE() – Gegevens verwijderen uit een JSON-document in MySQL

  2. Converteer OracleParameter.Value naar Int32

  3. Een externe sleutel toevoegen aan een bestaande tabel in SQLite

  4. Ontvang de eerste maandag van een jaar in SQLite