sql >> Database teknologi >  >> RDS >> Sqlserver

JSON_QUERY() Eksempler i SQL Server (T-SQL)

Når du bruger JSON med SQL Server, kan du bruge JSON_QUERY() funktion til at udtrække et objekt eller et array fra en JSON-streng.

For at bruge denne funktion skal du angive JSON-udtrykket som et argument. Du kan også angive et andet (valgfrit) argument for at angive objektet eller arrayet, der skal udtrækkes.

Syntaks

Syntaksen ser sådan ud:

JSON_QUERY ( expression [ , path ] )  

Hvor expression er JSON-strengudtrykket og path er det objekt eller det array, du vil udtrække fra det udtryk. path argument er valgfrit (hvis du ikke angiver det, returneres hele JSON-dokumentet).

Stiargumentet (hvis det er angivet) kan inkludere en valgfri stitilstand komponent. Denne valgfri stitilstand kan være en værdi af enten lax eller strict . Denne værdi bestemmer, hvad der sker i tilfælde af, at den angivne sti er ugyldig. Stitilstanden (hvis den findes) kommer før dollartegnet.

Eksempel 1 – Grundlæggende brug

Her er et eksempel til at demonstrere grundlæggende brug af JSON_QUERY() funktion.

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

Resultat:

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

I dette eksempel erklærer og indstiller jeg først en variabel kaldet @data . Jeg tildeler derefter en matrix til denne variabel. Når jeg har gjort dette, kører jeg en forespørgsel mod det array.

I dette tilfælde bruger jeg Cities[0] for at referere til det første element i arrayet (JSON-arrays bruger nul-baseret nummerering).

Jeg kunne få adgang til det andet element ved at bruge Cities[1] . Sådan:

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

Resultat:

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

Eksempel 2 – Returner hele JSON-udtrykket

Det andet argument er valgfrit, så hvis du udelader det, returneres hele JSON-dokumentet. Her er, hvad der sker, når vi gør det ved at bruge de samme data fra de tidligere eksempler:

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

Resultat:

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

Eksempel 3 – Et databaseeksempel

Hvis vi skulle lægge data fra det forrige eksempel ind i en database, kunne vi omskrive forespørgslen som følger:

SELECT 
  JSON_QUERY(Document,'$.Cities[0]') AS 'City 1'
FROM Json_Documents

Resultat:

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

Dette forudsætter, at JSON-dokumentet er gemt i en kolonne kaldet Document , som er i en tabel kaldet Json_Documents .

Eksempel 4 – Skalære værdier

JSON_QUERY() Funktionen er ikke designet til at returnere skalære værdier. Hvis du vil returnere en skalarværdi, skal du bruge JSON_VALUE() funktion i stedet for.

Der er dog intet, der forhindrer dig i at kombinere begge funktioner i en forespørgsel for at returnere data på forskellige niveauer af granularitet.

Her er et eksempel:

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

Resultat:

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

I dette eksempel brugte jeg JSON_VALUE() til at udtrække forskellige skalarværdier, men jeg brugte også JSON_QUERY() for at returnere en hel matrix (som JSON_VALUE() kan ikke gøre).

Eksempel 5 – Stitilstand

Som nævnt har du også mulighed for at angive stitilstanden. Dette kan enten være lax eller strict .

Værdien af ​​stitilstanden bestemmer, hvad der sker, når stiudtrykket indeholder en fejl. Specifikt:

  • slappe tilstand, returnerer funktionen tomme værdier, hvis stiudtrykket indeholder en fejl. For eksempel, hvis du anmoder om værdien $.name , og JSON-teksten indeholder ikke et navn tast, returnerer funktionen null, men rejser ikke en fejl.
  • streng tilstand, rejser funktionen en fejl, hvis stiudtrykket indeholder en fejl.

Standardværdien er lax .

Her er et eksempel for at demonstrere forskellen mellem disse to tilstande.

Fejl i slap tilstand

Her er, hvad der sker, når stiudtrykket indeholder en fejl, mens det er i slap tilstand.

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

Resultat:

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

I dette eksempel forsøger vi at returnere en skalarværdi, men JSON_QUERY() laver ikke skalære værdier. Som nævnt returnerer den kun objekter og arrays. I dette tilfælde får vi en nulværdi (fordi vi bruger lax mode).

Fejl i streng tilstand

Her er, hvad der sker, når vi kører den samme kode i streng tilstand.

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

Resultat:

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

Som forventet resulterer streng tilstand i en fejlmeddelelse, der forklarer fejlen.


  1. Oracle Trigger WHEN-klausuleksempel

  2. CONV() – Konverter tal mellem forskellige baser i MySQL

  3. Brug MySQL Relational Databases på Ubuntu 9.10 (Karmic)

  4. Oprettelse af en kopi af en database i PostgreSQL