Dela via


JSON-sökvägsuttryck i SQL Database Engine

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (endast serverlös SQL-pool)SQL-databas i Förhandsversion av Microsoft Fabric

Använd JSON-sökvägsuttryck för att referera till egenskaperna för JSON-objekt.

Du måste ange ett sökvägsuttryck när du anropar följande funktioner.

  • När du anropar OPENJSON för att skapa en relationsvy över JSON-data.
  • När du anropar JSON_VALUE för att extrahera ett värde från JSON-text.
  • När du anropar JSON_QUERY för att extrahera ett JSON-objekt eller en matris.
  • När du anropar JSON_MODIFY för att uppdatera värdet för en egenskap i en JSON-sträng.

Delar av ett sökvägsuttryck

Ett sökvägsuttryck har två komponenter.

  1. Det valfria sökvägsläget med värdet lax eller strict.

  2. Själva sökvägen .

Path mode

I början av sökvägsuttrycket kan du deklarera sökvägsläget genom att ange nyckelordet lax eller strict. Standardvärdet är lax.

  • I lax läget returnerar funktionen tomma värden om sökvägsuttrycket innehåller ett fel. Om du till exempel begär värdet $.name, och JSON-texten inte innehåller en name nyckel, returnerar funktionen null, men genererar inget fel.

  • I strict läge genererar funktionen ett fel om sökvägsuttrycket innehåller ett fel.

Följande fråga anger lax uttryckligen läget i sökvägsuttrycket.

DECLARE @json AS NVARCHAR (MAX);

SET @json = N'{ ... }';

SELECT *
FROM OPENJSON (@json, N'lax $.info');

Path

Efter den valfria sökvägslägesdeklarationen anger du själva sökvägen.

  • Dollartecknet ($) representerar kontextobjektet.

  • Egenskapsstigen är en serie steg längs stigen. Sökvägssteg kan innehålla följande element och operatorer.

    • Key names. Till exempel $.name och $."first name". Om nyckelnamnet börjar med ett dollartecken eller innehåller specialtecken som blanksteg eller punktoperatorer(.) ska det omgivas med citattecken.

    • Array elements. Till exempel $.product[3]. Matriser är nollbaserade.

    • Punktoperatorn (.) anger en medlem i ett objekt. I $.people[1].surname är surname ett barn till people.

    • Matrisens jokertecken och intervallsökningar stöds också om indata är ett JSON-typvärde.

Stöd för jokertecken och intervall för array

Note

Stöd för jokertecken och intervall för matriser är för närvarande i förhandsversion och är endast tillgängligt i förhandsversionen av SQL Server 2025 (17.x).

SQL Server 2025 (17.x) Preview expanderar sökvägsuttrycket ANSI SQL/JSON för att stödja en matris med jokertecken. Med jokertecknet Matris kan du ange alla element, elementintervall, en lista över element eller specialtoken "last" för att ange det sista värdet i en JSON-matris. SQL/JSON-matriser använder nollbaserat index. SQL/JSON-sökväg med jokertecken kan användas i JSON_QUERY, JSON_PATH_EXISTS och JSON_CONTAINS.

Funktionen JSON_VALUE stöder sökvägsuttrycket SQL/JSON, men returvärdet för en JSON_VALUE funktion är en SQL-skalär och därför returneras NULL alltid funktionen för alla SQL/JSON-sökvägar som pekar på ett JSON-objekt eller en matris. Endast wildcard-tecken för array stöds om indata är av typen json.

Följande syntax visar hur jokertecken, intervall och specialtoken last kan användas:

path[elements ]

elements ::= {
*
| number
| number to number
| last
| {number...[, number] }
}

Den speciella token last kan användas i stället för talvärde. Om ett intervall anges måste intervallet anges i ökande ordning.

Exempel på några giltiga SQL/JSON-sökvägsuttryck:

Path Description
$[*] All elements
$[0] First element
$[0 to 2] De tre första elementen
$[last] Last element
$[last, 0] Invalid
$[last, 2, 0, last] Invalid
$.creditcards[0].type Returnerar typegenskapsvärdet för det första elementet i creditcards matrisen
$.credit_cards[*].type Returnerar typegenskapsvärdet för alla element i creditcards matrisen
$.credit_cards[0, 2].type Returnerar typegenskapsvärdet för det första och tredje elementet i creditcards matrisen
$.credit_cards[1 to 3].type Returnerar typegenskapsvärdet för det andra till fjärde elementet i creditcards matrisen
$.credit_cards[last].type Returnerar typegenskapsvärdet för det sista elementet i creditcards matrisen
$.credit_cards[last, 0].type Returnerar typegenskapsvärdet för det sista och första elementet i creditcards matrisen

Examples

Exemplen i det här avsnittet refererar till följande JSON-text.

{
    "people": [{
        "name": "John",
        "surname": "Doe"
    }, {
        "name": "Jane",
        "surname": null,
        "active": true
    }]
}

I följande tabell visas några exempel på sökvägsuttryck.

Path expression Value
$.people[0].name John
$.people[1] { "name": "Jane", "surname": null, "active": true }
$.people[1].surname NULL
$ { "people": [ { "name": "John", "surname": "Doe" },{ "name": "Jane", "surname": null, "active": true } ] }
$.people[last].name ["Jane"]
$.people[0 to 1].name ["John","Jane"]
$.people[0, 1].name ["John","Jane"]

Så här hanterar inbyggda funktioner duplicerade sökvägar

Om JSON-texten innehåller dubblettegenskaper – till exempel två nycklar med samma namn på samma nivå – returnerar funktionerna JSON_VALUE och JSON_QUERY endast det första värdet som matchar sökvägen. Om du vill parsa ett JSON-objekt som innehåller dubblettnycklar och returnera alla värden använder du OPENJSON, som du ser i följande exempel.

DECLARE @json AS NVARCHAR (MAX);

SET @json = N'{"person":{"info":{"name":"John", "name":"Jack"}}}';

SELECT value
FROM OPENJSON (@json, '$.person.info');

Läs mer om JSON

En visuell introduktion till det inbyggda JSON-stödet finns i följande video: