Jika Anda mencoba mengekstrak nilai dari dokumen JSON, tetapi satu atau beberapa nilai pada tingkat yang sama memiliki kunci duplikat, Anda mungkin mengalami masalah jika mencoba mengekstrak nilai tersebut menggunakan JSON_QUERY()
atau JSON_VALUE()
.
Kedua fungsi tersebut hanya akan mengembalikan nilai pertama yang cocok dengan jalurnya.
Untungnya, ada pilihan lain.
OPENJSON()
fungsi akan mengembalikan semua nilai dari kunci duplikat pada level yang sama.
Contoh
Berikut adalah contoh untuk mendemonstrasikan OPENJSON()
mengembalikan properti duplikat pada level yang sama.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT * FROM OPENJSON(@json, '$.dog.details');
Hasil:
+-------+----------+--------+| kunci | nilai | ketik ||-------+----------+--------|| nama | Ambil | 1 || nama | Anjing Baik | 1 || seks | laki-laki | 1 |+-------+----------+--------+
Contoh ini mengembalikan semua anak dari $.dog.details
kunci.
Dalam hal ini, kami memiliki dua kunci dengan nama yang sama pada level yang sama (name
kunci).
Jika kita ingin mengembalikan hanya nilai dari dua name
kunci, kita bisa melakukan sesuatu seperti berikut.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';
Hasil:
+----------+| nilai ||----------|| Ambil || Anjing Baik |+----------+
JSON_VALUE()
&JSON_QUERY()
Seperti yang disebutkan, keduanya JSON_VALUE()
dan JSON_QUERY()
hanya mengembalikan nilai pertama yang cocok dengan jalurnya.
Jadi jika kita mencoba menggunakannya terhadap dokumen JSON di atas, kita mendapatkan hasil sebagai berikut.
JSON_VALUE()
JSON_VALUE()
mengembalikan nilai skalar dari string JSON, sehingga akan mengembalikan hasil berikut.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];
Hasil:
+-------------+| JSON_VALUE ||--------------|| Ambil |+--------------+
JSON_QUERY()
JSON_QUERY()
mengekstrak objek atau larik dari string JSON, sehingga akan mengembalikan hasil berikut.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];
Hasil:
+-------------+| JSON_QUERY ||--------------|| { "name" :"Ambil", "name" :"Good Dog", "sex" :"male" }----- |Setidaknya dengan
JSON_QUERY()
kita bisa melihat kunci duplikat, tetapi kita tidak mendapatkan nilai individualnya seperti yang kita dapatkan denganOPENJSON()
.