Dua dari banyak fungsi T-SQL yang tersedia di SQL Server adalah JSON_QUERY()
dan JSON_VALUE()
. Fungsi-fungsi ini dapat digunakan untuk mengekstrak data dari dokumen JSON.
Sintaks umum mereka serupa, dan pada pandangan pertama, Anda mungkin berpikir mereka melakukan hal yang persis sama, tetapi sebenarnya tidak. Pasti ada tempat untuk kedua fungsi saat bekerja dengan JSON dan SQL Server.
Artikel ini membahas perbedaan antara JSON_QUERY()
dan JSON_VALUE()
.
Perbedaan
Kedua fungsi ini memiliki definisi yang sedikit berbeda, sintaks yang sedikit berbeda, dan nilai pengembaliannya sedikit berbeda.
Definisi
Berikut adalah bagaimana kedua fungsi tersebut didefinisikan:
JSON_QUERY()
- Mengekstrak objek atau larik dari string JSON.
JSON_VALUE()
- Mengekstrak nilai skalar dari string JSON.
Jadi perbedaan antara kedua fungsi ini adalah apa yang mereka ekstrak. Yang satu mengekstrak objek atau larik, yang lain mengekstrak nilai skalar.
Perbedaan Sintaks
Perbedaan lainnya adalah pada sintaks:
JSON_QUERY ( expression [ , path ] ) JSON_VALUE ( expression , path )
Lihat JSON_QUERY()
sintaksis. Tanda kurung siku di sekitar path
argumen berarti bahwa itu adalah argumen opsional. Itu karena fungsi ini dapat mengembalikan seluruh dokumen JSON jika diperlukan.
Namun, argumen jalur adalah argumen yang diperlukan saat menggunakan JSON_VALUE()
fungsi. Jadi Anda harus memberikan kedua argumen saat menggunakan fungsi ini.
Mengembalikan Nilai
Dan satu lagi perbedaan dalam nilai pengembaliannya.
JSON_QUERY()
mengembalikan fragmen JSON dari tipenvarchar(max)
JSON_VALUE()
mengembalikan nilai teks tunggal jenisnvarchar(4000)
Contoh 1 – Ekstrak Nilai Skalar
Berikut adalah contoh untuk menunjukkan perbedaan antara fungsi-fungsi ini saat mencoba mengekstrak nilai skalar.
SELECT JSON_VALUE('{"Name": "Homer"}', '$.Name') AS 'JSON_VALUE', JSON_QUERY('{"Name": "Homer"}', '$.Name') AS 'JSON_QUERY';
Hasil:
+--------------+--------------+ | JSON_VALUE | JSON_QUERY | |--------------+--------------| | Homer | NULL | +--------------+--------------+
Jadi kedua fungsi mencoba mengekstrak nilai yang sama dari dokumen JSON, tetapi hanya satu yang berhasil:JSON_VALUE()
. Ini karena nilai yang mereka coba ekstrak adalah nilai skalar. Pada dasarnya, nilai skalar merupakan satu kesatuan data. Itu bisa berupa string teks atau angka. Tapi itu tidak bisa berupa objek atau array.
Contoh 2 – Ekstrak Array
Dalam contoh ini, kedua fungsi mencoba mengekstrak seluruh array.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Hobbies') AS 'JSON_VALUE', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'JSON_QUERY';
Hasil:
+--------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | |--------------+----------------------------------------| | NULL | ["Eating", "Sleeping", "Base Jumping"] | +--------------+----------------------------------------+
Dalam hal ini, hanya JSON_QUERY()
fungsi berhasil.
Contoh 3 – Mengekstrak Item Array
Contoh ini mirip dengan yang sebelumnya, kecuali bahwa alih-alih mencoba mengekstrak seluruh array, kita hanya menginginkan satu item dari array.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'JSON_VALUE', JSON_QUERY(@data,'$.Suspect.Hobbies[2]') AS 'JSON_QUERY';
Hasil:
+--------------+--------------+ | JSON_VALUE | JSON_QUERY | |--------------+--------------| | Base Jumping | NULL | +--------------+--------------+
Jadi kali ini JSON_VALUE()
adalah pemenangnya.
Contoh 4 – Ekstrak Objek
Mari kita coba untuk keseluruhan objek.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect') AS 'JSON_VALUE', JSON_QUERY(@data,'$.Suspect') AS 'JSON_QUERY';
Hasil:
+--------------+--------------+ | JSON_VALUE | JSON_QUERY | |--------------+--------------| | NULL | { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } | +--------------+--------------+
Dan JSON_QUERY()
menang.
(Maafkan pemformatan, beginilah cara alat baris perintah MSSQL saya mengembalikan hasilnya).
Contoh 5 – Ekstrak Seluruh Dokumen JSON
Mari kita coba untuk seluruh dokumen JSON.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_VALUE(@data, '$') AS 'JSON_VALUE', JSON_QUERY(@data, '$') AS 'JSON_QUERY';
Hasil:
+--------------+--------------+ | JSON_VALUE | JSON_QUERY | |--------------+--------------| | NULL | { "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] } | +--------------+--------------+
Jadi JSON_QUERY()
adalah satu-satunya yang dapat mengembalikan seluruh dokumen.
Contoh 6 – Abaikan Path
Perbedaan lain antara kedua fungsi ini adalah, argumen path bersifat opsional saat menggunakan JSON_QUERY()
. Jika Anda menghilangkan ini, seluruh dokumen JSON dikembalikan.
Anda tidak dapat menghilangkan argumen ini saat menggunakan JSON_VALUE()
, karena ini adalah argumen yang diperlukan. Ini mungkin karena fakta bahwa fungsi hanya dapat mengembalikan nilai skalar. Jika argumen pertama hanya terdiri dari nilai skalar, itu tidak akan menjadi JSON yang valid.
Bagaimanapun, inilah contoh menghilangkan argumen jalur dari JSON_QUERY()
:
SELECT JSON_QUERY('{"Name": "Homer"}') AS 'Result';
Hasil:
+-------------------+ | Result | |-------------------| | {"Name": "Homer"} | +-------------------+
Dan inilah yang terjadi jika kita mencoba trik itu dengan JSON_VALUE()
:
SELECT JSON_VALUE('{"Name": "Homer"}') AS 'Result';
Hasil:
Msg 174, Level 15, State 1, Line 1 The json_value function requires 2 argument(s).
Contoh 7 – Mode Jalur
Dalam contoh sebelumnya, ketika suatu fungsi tidak dapat menangani jalur yang disediakan, ia mengembalikan NULL
. Ini karena semua contoh tersebut dijalankan dalam mode longgar (mode default).
Jika kami menjalankannya dalam mode ketat, kami akan menerima kesalahan sebagai gantinya. Untuk menentukan mode jalur secara eksplisit, cukup tambahkan sebelum tanda dolar (dan beri spasi di antaranya).
Berikut ini contoh yang terjadi saat Anda memberikan jalur yang tidak valid saat dalam mode ketat:
SELECT JSON_VALUE('{"Name": "Homer"}', 'strict $.Name') AS 'JSON_VALUE', JSON_QUERY('{"Name": "Homer"}', 'strict $.Name') AS 'JSON_QUERY';
Hasil:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.