Saat menggunakan JSON dengan SQL Server, Anda dapat menggunakan JSON_VALUE()
berfungsi untuk mengembalikan nilai skalar dari string JSON.
Untuk menggunakan fungsi ini, Anda memberikan dua argumen; ekspresi JSON, dan properti yang akan diekstrak.
Sintaks
Sintaksnya seperti ini:
JSON_VALUE ( expression , path )
Dimana expression
adalah ekspresi string JSON, dan path
adalah properti yang ingin Anda ekstrak dari ekspresi itu.
Argumen jalur dapat menyertakan mode jalur opsional komponen. Mode jalur opsional ini dapat berupa nilai lax
atau strict
. Nilai ini, jika ada, muncul sebelum tanda dolar.
Contoh 1 – Penggunaan Dasar
Berikut adalah contoh untuk mendemonstrasikan penggunaan dasar JSON_VALUE()
fungsi.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Hasil:
+----------+ | Result | |----------| | Bruce | +----------+
Dalam contoh ini:
- The
{"Name": "Bruce"}
argumen adalah ekspresi JSON (yang kecil, tetapi masih merupakan ekspresi JSON yang valid). Ekspresi JSON terdiri dari pasangan kunci/nilai. Dalam hal ini,Name
adalah kuncinya,Bruce
adalah nilainya. - The
$.Name
argumen adalah jalan. Jalur ini mereferensikan nilaiName
kunci ekspresi JSON. Jadi kita bisa mengekstrak nilainya dengan mereferensikan nama pasangannya.
Contoh 2 – Array
Untuk mengekstrak nilai dari array, referensikan indeksnya dalam tanda kurung siku, diikuti dengan kunci yang relevan. Ini contohnya:
/* CREATE THE ARRAY (and put into a variable called @data) */ DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' /* QUERY THE ARRAY */ SELECT JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[0].District') AS 'District', JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population' UNION ALL SELECT JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[1].District') AS 'District', JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
Hasil:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Jadi dalam contoh ini, kita membuat array JSON dan memasukkannya ke dalam variabel bernama @data
. Kami kemudian menjalankan kueri, menggunakan @data
sebagai argumen pertama dari JSON_VALUE()
fungsi (ini karena @data
berisi ekspresi JSON).
Array menggunakan penomoran berbasis nol, jadi untuk mengekstrak item pertama kita perlu menggunakan Cities[0]
, yang kedua Cities[1]
, dan seterusnya.
Contoh 3 – Contoh Basis Data
Jika kita memasukkan data dari contoh sebelumnya ke dalam database, kita dapat menulis ulang query sebagai berikut:
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
Hasil:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Ini mengasumsikan bahwa dokumen JSON disimpan dalam kolom yang disebut Document
, yang ada dalam tabel bernama Json_Documents
.
Contoh 4 – Mode Jalur
Seperti yang disebutkan, Anda juga memiliki opsi untuk menentukan mode jalur. Ini bisa berupa lax
atau strict
.
Nilai mode jalur menentukan apa yang terjadi ketika ekspresi jalur berisi kesalahan. Khususnya:
- Dalam longgar mode, fungsi mengembalikan nilai kosong jika ekspresi jalur berisi kesalahan. Misalnya, jika Anda meminta nilai $.name , dan teks JSON tidak berisi nama key, fungsi mengembalikan null, tetapi tidak memunculkan kesalahan.
-
Dalam ketat mode, fungsi memunculkan kesalahan jika ekspresi jalur berisi kesalahan.
Nilai defaultnya adalah lax
.
Berikut adalah contoh untuk menunjukkan perbedaan antara kedua mode ini.
Kesalahan dalam mode longgar
Inilah yang terjadi ketika ekspresi jalur berisi kesalahan saat dalam mode longgar.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Hasil:
+----------+ | Result | |----------| | NULL | +----------+
Dalam contoh ini kami mencoba mereferensikan Hobbies
, tetapi kunci itu tidak ada di dokumen JSON. Dalam hal ini kita mendapatkan nilai null (karena kita menggunakan mode lax).
Kesalahan dalam mode ketat
Inilah yang terjadi jika kita menjalankan kode yang sama dalam mode ketat.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Hasil:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Seperti yang diharapkan, mode ketat menghasilkan pesan kesalahan yang ditampilkan.
Contoh 5 – Mengembalikan Objek dan Array
JSON_VALUE()
fungsi tidak mengembalikan objek dan array. Jika Anda ingin mengembalikan objek atau larik, gunakan JSON_QUERY()
fungsi sebagai gantinya. Berikut adalah contoh di mana saya menggunakan kedua fungsi dalam kueri.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Mae Sai", "Province": "Chiang Rai", "Country": "Thailand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Hasil:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
Dalam hal ini, saya menggunakan JSON_VALUE()
untuk mengembalikan berbagai nilai skalar, dan JSON_QUERY()
untuk mengembalikan array.
Jadi, jika Anda perlu mengembalikan objek atau larik (termasuk seluruh dokumen JSON), lihat JSON_QUERY()
Contoh di SQL Server.