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

Eksempler på SQL Server FOR JSON PATH (T-SQL)

Når du bruger SQL-serveren, kan du bruge FOR JSON klausul i en forespørgsel for at formatere resultaterne som JSON. Når du gør dette, skal du vælge enten AUTO eller PATH mulighed. Denne artikel indeholder eksempler på brug af PATH mulighed.

Syntaks

Syntaksen ser sådan ud:

SELECT ...
  (your query goes here)
FOR JSON PATH;

Så dybest set, alt hvad du skal gøre er at tilføje FOR JSON PATH til slutningen af ​​din forespørgsel.

Eksempel 1 – Grundlæggende brug

Her er et eksempel til at demonstrere.

USE Music;
SELECT TOP 3 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON PATH;

Resultat:

[
    {
        "AlbumName": "Powerslave",
        "ReleaseDate": "1984-09-03"
    },
    {
        "AlbumName": "Powerage",
        "ReleaseDate": "1978-05-05"
    },
    {
        "AlbumName": "Singing Down the Lane",
        "ReleaseDate": "1956-01-01"
    }
]

Så resultaterne kommer ud som et pænt formateret JSON-dokument i stedet for i rækker og kolonner.

I dette tilfælde brugte jeg TOP 3 for at begrænse resultatsættet til kun tre resultater.

Enkelt linje resultater?

Dine resultater kan til at begynde med vises i en enkelt række og en enkelt kolonne og som en lang linje som denne:

Hvis dette er tilfældet, prøv at klikke på resultatsættet. Afhængigt af din databasestyringssoftware bør dette starte JSON-dokumentet, som det vises i ovenstående eksempel.

Om dette fungerer nøjagtigt som beskrevet, afhænger af den software, du bruger til at forespørge efter SQL Server.

I skrivende stund fungerede dette fint for mig, når jeg brugte SQL Operations Studio (som siden er blevet omdøbt til Azure Data Studio). Det fungerede også fint, når du brugte MSSQL-udvidelsen i VS Code. SSMS formaterer dog kun resultaterne som én lang linje (dog stadig i JSON-format).

Jeg havde også forskellige grader af succes med at bruge kommandolinjeværktøjer.

Du kan også opleve, at resultaterne i starten er fordelt på flere rækker, afhængigt af hvor stort resultatsættet er.

Hvis du ikke kan få det til at vise resultaterne på en tilfredsstillende måde, så prøv et andet værktøj.

Eksempel 2 – Forespørgsel på tværs af flere tabeller

I dette eksempel forespørger jeg to tabeller, der har en en-til-mange-relation mellem dem. I dette tilfælde kan hver kunstner have mange album, og jeg bruger en underforespørgsel til at hente albummene for hver kunstner.

USE Music;
SELECT TOP 2 ArtistName,
    (SELECT AlbumName 
        FROM Albums
        WHERE Artists.ArtistId = Albums.ArtistId
        FOR JSON PATH) AS Albums
FROM Artists
ORDER BY ArtistName
FOR JSON PATH;

Resultat:

[
    {
        "ArtistName": "AC/DC",
        "Albums": [
            {
                "AlbumName": "Powerage"
            }
        ]
    },
    {
        "ArtistName": "Allan Holdsworth",
        "Albums": [
            {
                "AlbumName": "All Night Wrong"
            },
            {
                "AlbumName": "The Sixteen Men of Tain"
            }
        ]
    }
]

I dette tilfælde er hvert album blevet indlejret under "Albums". Dette skyldes, at albummene returneres via en underforespørgsel.

Eksempel 3 – Indlejret output med punktnotation

Når du bruger PATH mulighed, kan du bruge punktseparerede kolonnenavne til at oprette indlejrede objekter.

For at gøre dette skal du bruge et punktsepareret alias. Her er et eksempel:

USE Music;
SELECT TOP 3 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH;

Resultat:

[
    {
        "AlbumId": 1,
        "Details": {
            "Album Name": "Powerslave",
            "Release Date": "1984-09-03"
        }
    },
    {
        "AlbumId": 2,
        "Details": {
            "Album Name": "Powerage",
            "Release Date": "1978-05-05"
        }
    },
    {
        "AlbumId": 3,
        "Details": {
            "Album Name": "Singing Down the Lane",
            "Release Date": "1956-01-01"
        }
    }
]

Eksempel 4 – Tilføj en rodnode

Du kan bruge ROOT() mulighed for at tilføje en rodnode til outputtet. Dette tilføjer et enkelt element på øverste niveau til outputtet. For at gøre dette skal du blot tilføje ROOT() mulighed til slutningen af ​​forespørgslen med det navn, du ønsker, at rodknuden skal have.

Så vi kan ændre det foregående eksempel til dette:

USE Music;
SELECT TOP 3 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH, ROOT('Albums');

Resultat:

{
    "Albums": [
        {
            "AlbumId": 1,
            "Details": {
                "Album Name": "Powerslave",
                "Release Date": "1984-09-03"
            }
        },
        {
            "AlbumId": 2,
            "Details": {
                "Album Name": "Powerage",
                "Release Date": "1978-05-05"
            }
        },
        {
            "AlbumId": 3,
            "Details": {
                "Album Name": "Singing Down the Lane",
                "Release Date": "1956-01-01"
            }
        }
    ]
}

Eksempel 5 – Fjern Array Wrapper

Du kan bruge WITHOUT_ARRAY_WRAPPER mulighed for at fjerne de firkantede parenteser, der omgiver resultaterne.

Eksempel:

USE Music;
SELECT TOP 1 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

Resultat:

{
    "AlbumName": "Powerslave",
    "ReleaseDate": "1984-09-03"
}

Bemærk, at hvis du gør dette på et resultat med flere rækker, ender du med ugyldig JSON.


  1. Hvordan kan jeg bruge UUID'er i SQLAlchemy?

  2. Sådan får du månedens navn fra en dato i Oracle

  3. Skift separatoren til et komma i SQLite-forespørgselsresultater

  4. Oracle SQL - Identificer sekventielle værdiområder