Udostępnij za pomocą


JSON_VALUE (Transact-SQL)

Dotyczy: SQL Server 2016 (13.x) i nowsze wersje usługi Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics— punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse wbazie danych Microsoft Fabric SQL Database w usłudze Microsoft Fabric

Składnia JSON_VALUE wyodrębnia wartość skalarną z ciągu JSON.

Aby wyodrębnić obiekt lub tablicę z ciągu JSON zamiast wartości skalarnej, zobacz JSON_QUERY. Aby uzyskać informacje o różnicach między JSON_VALUE i JSON_QUERY, zobacz Porównanie JSON_VALUE i JSON_QUERY.

Transact-SQL konwencje składni

Syntax

JSON_VALUE ( expression , path [ RETURNING data_type ] )

Arguments

expression

Wyrażenie. Zazwyczaj nazwa zmiennej lub kolumny zawierającej tekst JSON.

Jeśli JSON_VALUE znajdzie kod JSON, który nie jest prawidłowy w wyrażeniu , zanim znajdzie wartość zidentyfikowaną przez ścieżkę, funkcja zwróci błąd. Jeśli JSON_VALUE nie znajdzie wartości zidentyfikowanej przez ścieżkę, skanuje cały tekst i zwraca błąd, jeśli znajdzie kod JSON, który nie jest prawidłowy nigdzie w wyrażeniu.

path

Ścieżka JSON określająca właściwość do wyodrębnienia. Aby uzyskać więcej informacji, zobacz Wyrażenia ścieżki JSON w a aparatu bazy danych SQL.

W programie SQL Server 2017 (14.x) i usłudze Azure SQL Database można podać zmienną jako wartość ścieżki.

Jeśli format ścieżki jest nieprawidłowy, JSON_VALUE zwraca błąd.

data_type

Zwraca wartość określoną w typie SQL. Obsługiwane tylko wtedy, gdy dane wejściowe są typem JSON. Obsługiwane typy SQL to: tinyint, smallint, int, bigint, decimal, numeryczny, float, real, char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), date, time, datetime2 i datetimeoffset.

Wartość zwracana

Jeśli RETURNING nie jest uwzględniona:

  • Zwraca pojedynczą wartość tekstową typu nvarchar(4000). Sortowanie zwróconej wartości jest takie samo jak sortowanie wyrażenia wejściowego.

  • Jeśli wartość jest większa niż 4000 znaków:

    • W trybie JSON_VALUE lax zwraca wartość NULL.
    • W trybie ścisłym JSON_VALUE zwraca błąd.

    Jeśli musisz zwrócić wartości skalarne większe niż 4000 znaków, użyj OPENJSON zamiast JSON_VALUE. Aby uzyskać więcej informacji, zobacz OPENJSON.

Jeśli RETURNING jest uwzględniona:

Zwraca wartość określoną w typie SQL. Obsługiwane typy SQL to: tinyint, smallint, int, bigint, decimal, numeryczny, float, real, char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), date, time, datetime2 i datetimeoffset.

Funkcje JSON działają tak samo, czy dokument JSON jest przechowywany w formacie varchar, nvarchar, czy natywnym typem danych json .

Remarks

Tryb lax i tryb ścisły

Rozważ następujący tekst JSON:

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

W poniższej tabeli porównaliśmy zachowanie JSON_VALUE w trybie lax i w trybie ścisłym. Aby uzyskać więcej informacji na temat opcjonalnej specyfikacji trybu ścieżki (lax lub strict), zobacz Wyrażenia ścieżki JSON w a aparatu bazy danych SQL.

Path Zwracana wartość w trybie lax Zwracana wartość w trybie ścisłym Więcej informacji
$ NULL Error Nie jest wartością skalarną.

Użyj JSON_QUERY zamiast tego.
$.info.type N'1' N'1' N/a
$.info.address.town N'Bristol' N'Bristol' N/a
$.info." adres" NULL Error Nie jest wartością skalarną.

Użyj JSON_QUERY zamiast tego.
$.info.tags NULL Error Nie jest wartością skalarną.

Użyj JSON_QUERY zamiast tego.
$.info.type[0] NULL Error Nie tablica.
$.info.none NULL Error Właściwość nie istnieje.

Examples

Przykład 1

W poniższym przykładzie użyto wartości właściwości town JSON i state w wynikach zapytania. Ponieważ JSON_VALUE zachowuje sortowanie źródła, kolejność sortowania wyników zależy od sortowania jsonInfo kolumny.

Note

(W tym przykładzie przyjęto założenie, że tabela o nazwie Person.Person zawiera kolumnę jsonInfo tekstu JSON i że ta kolumna ma strukturę pokazaną wcześniej w dyskusji na temat trybu lax i trybu ścisłego. W przykładowej AdventureWorks bazie danych Person tabela nie zawiera kolumny jsonInfo .

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

Przykład 2

Poniższy przykład wyodrębnia wartość właściwości town JSON do zmiennej lokalnej.

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

Przykład 3

Poniższy przykład tworzy obliczone kolumny na podstawie wartości właściwości JSON.

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

Przykład 4

Poniższy przykład wyodrębnia wartość z tablicy JSON przy użyciu metody JSON_VALUE i zwraca wartość jako wartość typu daty.

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