Saat menggunakan JSON dengan SQL Server, Anda dapat menggunakan JSON_QUERY()
berfungsi untuk mengekstrak objek atau larik dari string JSON.
Untuk menggunakan fungsi ini, Anda memberikan ekspresi JSON sebagai argumen. Anda juga dapat memberikan argumen kedua (opsional) untuk menentukan objek atau larik yang akan diekstrak.
Sintaks
Sintaksnya seperti ini:
JSON_QUERY ( ekspresi [ , jalur ] )
Dimana expression
adalah ekspresi string JSON, dan path
adalah objek atau larik yang ingin Anda ekstrak dari ekspresi tersebut. path
argumen bersifat opsional (jika Anda tidak memberikannya, seluruh dokumen JSON akan dikembalikan).
Argumen jalur (jika disertakan) dapat menyertakan mode jalur opsional komponen. Mode jalur opsional ini dapat berupa nilai lax
atau strict
. Nilai ini menentukan apa yang terjadi jika jalur yang disediakan tidak valid. Mode jalur (jika disediakan) muncul sebelum tanda dolar.
Contoh 1 – Penggunaan Dasar
Berikut adalah contoh untuk mendemonstrasikan penggunaan dasar JSON_QUERY()
fungsi.
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Kabul", "CountryCode":"AFG", "District":"Kabol", "Population" :1780000 }, { "Nama":"Qandahar", "Kode Negara":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[0 ]') SEBAGAI 'Hasil';
Hasil:
+----------+| Hasil ||----------|| { "Nama":"Kabul", "Kode Negara":"AFG", "Distrik":"Kabol", "Populasi":1780000 } |+----------+
Dalam contoh ini, pertama-tama saya mendeklarasikan dan menetapkan variabel yang disebut @data
. Saya kemudian menetapkan array ke variabel ini. Setelah saya melakukan ini, saya menjalankan kueri terhadap array itu.
Dalam hal ini saya menggunakan Cities[0]
untuk mereferensikan item pertama dalam larik (array JSON menggunakan penomoran berbasis nol).
Saya dapat mengakses item kedua dengan menggunakan Cities[1]
. Seperti ini:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Kabul", "CountryCode":"AFG", "District":"Kabol", "Population" :1780000 }, { "Nama":"Qandahar", "Kode Negara":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[1 ]') SEBAGAI 'Hasil';
Hasil:
+----------+| Hasil ||----------|| { "Nama":"Qandahar", "Kode Negara":"AFG", "Distrik":"Qandahar", "Populasi":237500 } |+----------+
Contoh 2 – Mengembalikan Seluruh Ekspresi JSON
Argumen kedua adalah opsional, jadi jika Anda menghilangkannya, seluruh dokumen JSON dikembalikan. Inilah yang terjadi jika kita melakukannya menggunakan data yang sama dari contoh sebelumnya:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Kabul", "CountryCode":"AFG", "District":"Kabol", "Population" :1780000 }, { "Nama":"Qandahar", "Kode Negara":"AFG", "District":"Qandahar", "Population":237500 } ]}'PILIH JSON_QUERY(@data) SEBAGAI 'Hasil';Hasil:
+----------+| Hasil ||----------|| { "Kota":[ { "Nama":"Kabul", "Kode Negara":"AFG", "Distrik":"Kabol", "Populasi":1780000 }, { "Nama":"Qandahar", "Kode Negara" :"AFG", "District":"Qandahar", "Population":237500 } ]} |+----------+Contoh 3 – Contoh Basis Data
Jika kita memasukkan data dari contoh sebelumnya ke dalam database, kita dapat menulis ulang query sebagai berikut:
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1'FROM Json_DocumentsHasil:
+----------+| Kota 1 ||----------|| { "ID":1, "Name":"Kabul", "CountryCode":"AFG", "District":"Kabol", "Population":1780000 } |+----------+Ini mengasumsikan bahwa dokumen JSON disimpan dalam kolom yang disebut
Document
, yang ada dalam tabel bernamaJson_Documents
.Contoh 4 – Nilai Skalar
JSON_QUERY()
fungsi tidak dirancang untuk mengembalikan nilai skalar. Jika Anda ingin mengembalikan nilai skalar, gunakanJSON_VALUE()
berfungsi sebagai gantinya.Namun, tidak ada yang menghentikan Anda untuk menggabungkan kedua fungsi dalam kueri untuk mengembalikan data pada berbagai tingkat perincian.
Ini contohnya:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Tersangka":{ "Nama":"Homer Simpson", "Hobi":["Makan", "Tidur", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobi', JSON_VALUE(@data,'$.Suspect.Hobbies [2]') SEBAGAI 'Hobi Terakhir';Hasil:
+---------------+------------------------------ ----------+------------+| Nama | Hobi | Hobi Terakhir ||---------------+------------------------------ ----------+------------|| Homer Simpson | ["Makan", "Tidur", "Lompat Dasar"] | Base Jumping |+---------------+------------------------------ ----------+------------+Dalam contoh ini saya menggunakan
JSON_VALUE()
untuk mengekstrak berbagai nilai skalar, tetapi saya juga menggunakanJSON_QUERY()
untuk mengembalikan seluruh larik (yangJSON_VALUE()
tidak bisa melakukannya).Contoh 5 – Mode Jalur
Seperti yang disebutkan, Anda juga memiliki opsi untuk menentukan mode jalur. Ini bisa berupa
lax
ataustrict
.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_QUERY('{"Name":"Bruce"}', 'lax $.Name') SEBAGAI 'Hasil';
Hasil:
+----------+| Hasil ||----------|| NULL |+----------+
Dalam contoh ini kami mencoba mengembalikan nilai skalar, tetapi JSON_QUERY()
tidak melakukan nilai skalar. Seperti disebutkan, itu hanya mengembalikan objek dan array. 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_QUERY('{"Name":"Bruce"}', 'strict $.Name') SEBAGAI 'Hasil';
Hasil:
Msg 13624, Level 16, Status 2, Baris 1Objek atau larik tidak dapat ditemukan di jalur JSON yang ditentukan.
Seperti yang diharapkan, mode ketat menghasilkan pesan kesalahan yang menjelaskan kesalahan tersebut.