Dela via


JSON_VALUE (Transact-SQL)

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-slutpunkt i Microsoft Fabric Warehouse i Microsoft FabricSQL Database i Förhandsversion av Microsoft Fabric

Syntaxen JSON_VALUE extraherar ett skalärt värde från en JSON-sträng.

Information om hur du extraherar ett objekt eller en matris från en JSON-sträng i stället för ett skalärt värde finns i JSON_QUERY. Information om skillnaderna mellan JSON_VALUE och JSON_QUERYfinns i Jämför JSON_VALUE och JSON_QUERY.

Transact-SQL syntaxkonventioner

Syntax

JSON_VALUE ( expression , path [ RETURNING data_type ] )

Arguments

expression

Ett uttryck. Vanligtvis namnet på en variabel eller en kolumn som innehåller JSON-text.

Om JSON_VALUE hittar JSON som inte är giltigt i uttrycket innan det hittar värdet som identifieras av sökvägen returnerar funktionen ett fel. Om JSON_VALUE inte hittar det värde som identifieras av sökvägen söker den igenom hela texten och returnerar ett fel om det hittar JSON som inte är giltigt någonstans i uttrycket.

path

En JSON-sökväg som anger vilken egenskap som ska extraheras. Mer information finns i JSON Path Expressions in the SQL Database Engine (JSON Path Expressions in the SQL Database Engine).

I SQL Server 2017 (14.x) och i Azure SQL Database kan du ange en variabel som värdet för sökvägen.

Om sökvägens format inte är giltigt JSON_VALUE returnerar ett fel.

data_type

Returnera det värde som anges i SQL-typen. Stöds endast om indata är en JSON-typ. De SQL-typer som stöds är: tinyint, smallint, int, bigint, decimal, numerisk, float, real, char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), date, time, datetime2 och datetimeoffset.

Returvärde

Om RETURNING inte ingår:

  • Returnerar ett enskilt textvärde av typen nvarchar(4000). Sortering av det returnerade värdet är samma som sortering av indatauttrycket.

  • Om värdet är större än 4 000 tecken:

    • I slappt läge JSON_VALUE returnerar NULL.
    • I strikt läge returnerar JSON_VALUE ett fel.

    Om du måste returnera skalärvärden som är större än 4 000 tecken använder du OPENJSON i stället för JSON_VALUE. Mer information finns i OPENJSON.

Om RETURNING ingår:

Returnerar det värde som anges i SQL-typen. De SQL-typer som stöds är: tinyint, smallint, int, bigint, decimal, numerisk, float, real, char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), date, time, datetime2 och datetimeoffset.

JSON-funktioner fungerar på samma sätt oavsett om JSON-dokumentet lagras i varchar, nvarchar eller den interna json-datatypen .

Remarks

Släpphänt läge och strikt läge

Tänk på följande JSON-text:

DECLARE @jsonInfo AS NVARCHAR (MAX);

SET @jsonInfo = N'{
     "info":{
       "type":1,
       "address":{
         "town":"Bristol",
         "county":"Avon",
         "country/region":"England"
       },
       "tags":["Sport", "Water polo"]
    },
    "type":"Basic"
 }';

I följande tabell jämförs beteendet för JSON_VALUE i slappt läge och i strikt läge. Mer information om den valfria sökvägslägesspecifikationen (slapp eller strikt) finns i JSON Path Expressions in the SQL Database Engine (JSON Path Expressions in the SQL Database Engine).

Path Returnera värde i släpphänt läge Returnera värde i strikt läge Mer information
$ NULL Error Inte ett skalärt värde.

Använd JSON_QUERY i stället.
$.info.type N'1' N'1' N/a
$.info.address.town N'Bristol' N'Bristol' N/a
$.info." adress" NULL Error Inte ett skalärt värde.

Använd JSON_QUERY i stället.
$.info.tags NULL Error Inte ett skalärt värde.

Använd JSON_QUERY i stället.
$.info.type[0] NULL Error Inte en matris.
$.info.none NULL Error Egenskapen finns inte.

Examples

Exempel 1

I följande exempel används värdena för JSON-egenskaperna town och state i frågeresultat. Eftersom JSON_VALUE bevarar sortering av källan beror sorteringsordningen för resultaten på sortering av jsonInfo kolumnen.

Note

(Det här exemplet förutsätter att en tabell med namnet Person.Person innehåller en jsonInfo kolumn med JSON-text och att den här kolumnen har strukturen som visades tidigare i diskussionen om släpphänt läge och strikt läge. AdventureWorks I exempeldatabasen Person innehåller tabellen inte någon jsonInfo kolumn.)

SELECT FirstName,
       LastName,
       JSON_VALUE(jsonInfo, '$.info.address.town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo, '$.info.address.state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo, '$.info.address.town');

Exempel 2

I följande exempel extraheras värdet för JSON-egenskapen town till en lokal variabel.

DECLARE @jsonInfo AS NVARCHAR (MAX);
DECLARE @town AS NVARCHAR (32);

SET @jsonInfo = N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[0].town'); -- Paris
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[1].town'); -- London

Exempel 3

I följande exempel skapas beräknade kolumner baserat på värdena för JSON-egenskaper.

CREATE TABLE dbo.Store
(
    StoreID INT IDENTITY (1, 1) NOT NULL,
    Address VARCHAR (500),
    jsonContent NVARCHAR (4000),
    Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
    Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
);

Exempel 4

I följande exempel extraheras ett värde från JSON-matrisen med och JSON_VALUE returnerar värdet som ett datumtypsvärde.

DECLARE @j AS JSON = '[1, 1.3333, true, "a", "1", "2025-01-01"]';

SELECT JSON_VALUE(@j, '$[5]' RETURNING date) AS date_value;
date_value
--------
2025-01-01