JSON_VALUE (T-SQL)
Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics
Mengekstrak nilai skalar dari string JSON.
Untuk mengekstrak objek atau array dari string JSON, bukan nilai skalar, lihat JSON_QUERY (Transact-SQL). Untuk informasi tentang perbedaan antara JSON_VALUE
dan , lihat Membandingkan JSON_VALUE dan JSON_QUERYJSON_QUERY
.
Sintaks
JSON_VALUE ( expression , path )
Argumen
expression
Ekspresi. Biasanya nama variabel atau kolom yang berisi teks JSON.
Jika JSON_VALUE
menemukan JSON yang tidak valid dalam ekspresi sebelum menemukan nilai yang diidentifikasi berdasarkan jalur, fungsi mengembalikan kesalahan. Jika JSON_VALUE
tidak menemukan nilai yang diidentifikasi berdasarkan jalur, nilai tersebut memindai seluruh teks dan mengembalikan kesalahan jika menemukan JSON yang tidak valid di mana saja dalam ekspresi.
jalan
Jalur JSON yang menentukan properti yang akan diekstrak. Untuk informasi selengkapnya, lihat Ekspresi Jalur JSON (SQL Server).
Di SQL Server 2017 (14.x) dan di Azure SQL Database, Anda dapat memberikan variabel sebagai nilai jalur.
Jika format jalur tidak valid, JSON_VALUE
mengembalikan kesalahan.
Nilai hasil
Mengembalikan nilai teks tunggal jenis nvarchar(4000). Kolase nilai yang dikembalikan sama dengan kolase ekspresi input.
Jika nilainya lebih besar dari 4000 karakter:
Dalam mode laks,
JSON_VALUE
mengembalikanNULL
.Dalam mode ketat,
JSON_VALUE
mengembalikan kesalahan.
Jika Anda harus mengembalikan nilai skalar yang lebih besar dari 4000 karakter, gunakan OPENJSON
alih-alih JSON_VALUE
. Untuk informasi selengkapnya, lihat OPENJSON (Transact-SQL).
Fungsi JSON berfungsi sama apakah dokumen JSON disimpan dalam varchar, nvarchar, atau jenis data json asli.
Keterangan
Mode laks dan mode ketat
Pertimbangkan teks JSON berikut:
DECLARE @jsonInfo NVARCHAR(MAX)
SET @jsonInfo=N'{
"info":{
"type":1,
"address":{
"town":"Bristol",
"county":"Avon",
"country":"England"
},
"tags":["Sport", "Water polo"]
},
"type":"Basic"
}'
Tabel berikut membandingkan perilaku JSON_VALUE
dalam mode lax dan dalam mode ketat. Untuk informasi selengkapnya tentang spesifikasi mode jalur opsional (lax atau ketat), lihat Ekspresi Jalur JSON (SQL Server).
Jalur | Mengembalikan nilai dalam mode laks | Mengembalikan nilai dalam mode ketat | Info selengkapnya |
---|---|---|---|
$ | NULL |
Kesalahan | Bukan nilai skalar. Gunakan JSON_QUERY sebagai gantinya. |
$.info.type | N'1' | N'1' | T/a |
$.info.address.town | N'Bristol' | N'Bristol' | T/a |
$.info." alamat" | NULL |
Kesalahan | Bukan nilai skalar. Gunakan JSON_QUERY sebagai gantinya. |
$.info.tags | NULL |
Kesalahan | Bukan nilai skalar. Gunakan JSON_QUERY sebagai gantinya. |
$.info.type[0] | NULL |
Kesalahan | Bukan array. |
$.info.none | NULL |
Kesalahan | Properti tidak ada. |
Contoh
Contoh 1
Contoh berikut menggunakan nilai properti town
JSON dan state
dalam hasil kueri. Karena JSON_VALUE
mempertahankan kolase sumber, urutan pengurutan hasil tergantung pada kolase jsonInfo
kolom.
Catatan
(Contoh ini mengasumsikan bahwa tabel bernama Person.Person
berisi jsonInfo
kolom teks JSON, dan bahwa kolom ini memiliki struktur yang ditunjukkan sebelumnya dalam diskusi mode laks dan mode ketat. AdventureWorks
Dalam database sampel, Person
tabel sebenarnya tidak berisi jsonInfo
kolom.)
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')
Contoh 2
Contoh berikut mengekstrak nilai properti town
JSON ke dalam variabel lokal.
DECLARE @jsonInfo NVARCHAR(MAX)
DECLARE @town 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
Contoh 3
Contoh berikut membuat kolom komputasi berdasarkan nilai properti 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')
)