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

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

Når du bruger JSON med SQL Server, kan du bruge JSON_VALUE() funktion til at returnere en skalarværdi fra en JSON-streng.

For at bruge denne funktion giver du to argumenter; JSON-udtrykket og egenskaben, der skal udtrækkes.

Syntaks

Syntaksen ser sådan ud:

JSON_VALUE ( expression , path )

Hvor udtryk er JSON-strengudtrykket og sti er den egenskab, du vil udtrække fra det udtryk.

Stiargumentet kan inkludere en valgfri stitilstand komponent. Denne valgfri stitilstand kan være en værdi af enten lax eller strict . Denne værdi, hvis nogen, kommer før dollartegnet.

Eksempel 1 – Grundlæggende brug

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

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

Resultat:

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

I dette eksempel:

  • {"Navn":"Bruce"} argument er JSON-udtrykket (et lille, men stadig et gyldigt JSON-udtryk). JSON-udtryk består af et nøgle/værdi-par. I dette tilfælde Navn er nøglen, Bruce er dens værdi.
  • $.Name argument er vejen. Denne sti refererer til værdien af ​​Name nøglen til JSON-udtrykket. Så vi kan udtrække værdien ved at henvise til navnet på parret.

Eksempel 2 – Arrays

For at udtrække en værdi fra et array skal du henvise til dets indeks inden for firkantede parenteser efterfulgt af den relevante nøgle. Her er et eksempel:

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

Resultat:

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

Så i dette eksempel opretter vi et JSON-array og sætter det i en variabel kaldet @data . Vi kører derefter en forespørgsel ved hjælp af @data som det første argument for JSON_VALUE() funktion (dette skyldes @data indeholder JSON-udtrykket).

Arrays bruger nul-baseret nummerering, så for at udtrække det første element skal vi bruge Cities[0] , den anden Byer[1] , og så videre.

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

Resultat:

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

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

Eksempel 4 – Stitilstand

Som nævnt har du også mulighed for at angive stitilstanden. Dette kan enten være slappt 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_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';

Resultat:

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

I dette eksempel forsøger vi at henvise til Hobbyer , men den nøgle findes ikke i JSON-dokumentet. 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_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';

Resultat:

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

Som forventet resulterer streng tilstand i, at der vises en fejlmeddelelse.

Eksempel 5 – Returnering af objekter og arrays

JSON_VALUE() funktion returnerer ikke objekter og arrays. Hvis du vil returnere et objekt eller en matrix, skal du bruge JSON_QUERY() funktion i stedet for. Her er et eksempel, hvor jeg bruger begge funktioner i en forespørgsel.

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

Resultat:

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

I dette tilfælde bruger jeg JSON_VALUE() for at returnere forskellige skalarværdier og JSON_QUERY() for at returnere et array.

Så hvis du har brug for at returnere et objekt eller en matrix (inklusive hele JSON-dokumentet), se JSON_QUERY() Eksempler i SQL Server.


  1. Hvordan omdøber man noget i SQL Server, der har firkantede parenteser i navnet?

  2. Hvordan viser man rækkenumre i PostgreSQL-forespørgsel?

  3. Hvad er et indeks i SQL?

  4. postgres kolonne alias problem