Jika Anda telah menggunakan JSON_MODIFY()
fungsi untuk memodifikasi dokumen JSON di SQL Server, Anda mungkin terbiasa memodifikasi nilai bagian dari kunci/nilai Properti. Namun tahukah Anda bahwa Anda juga dapat memodifikasi kunci bagian?
Trik untuk melakukannya adalah menyalin nilainya ke kunci baru, lalu menghapus kunci lama.
Contoh di bawah.
Contoh Dasar
Berikut adalah contoh dasar untuk menunjukkan apa yang saya maksud.
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Name":"Homer"}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')), '$.Name', NULL ) -- Print the new JSON PRINT @data
Hasil:
{"Name":"Homer"} {"Handle":"Homer"}
Ini mencetak pasangan kunci/nilai asli, diikuti oleh pasangan kunci/nilai baru.
Meskipun kami dapat mengatakan bahwa kami "mengganti nama" kunci, kami sebenarnya baru saja membuat kunci baru, menyalin nilai yang ada ke kunci baru itu, lalu menghapus kunci lama dengan menyetelnya ke NULL
.
Dalam hal ini, kami menggunakan JSON_VALUE()
berfungsi untuk mengekstrak nilai.
Nilai Numerik
Anda harus berhati-hati saat menyalin data ke kunci baru. Secara default, SQL Server akan menyertakannya dalam tanda kutip ganda. Ini mungkin atau mungkin bukan yang Anda inginkan.
Namun, jika Anda menyalin nilai numerik, kemungkinan Anda ingin nilai numerik tetap (yaitu tanpa tanda kutip ganda). Dalam hal ini Anda harus menggunakan CAST()
berfungsi untuk mentransmisikannya sebagai tipe data numerik. Ini contohnya:
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Residents":768}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Population', CAST(JSON_VALUE(@data,'$.Residents') AS int)), '$.Residents', NULL ) -- Print the new JSON PRINT @data
Hasil:
{"Residents":768} {"Population":768}
Jadi nilai yang dihasilkan adalah angka.
Jika kita menghapus CAST()
fungsi dari contoh itu, kita berakhir dengan ini:
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Residents": 768}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Population', JSON_VALUE(@data,'$.Residents')), '$.Residents', NULL ) -- Print the new JSON PRINT @data
Hasil:
{"Residents": 768} {"Population":"768"}
Jadi dalam hal ini, kami tidak hanya mengganti nama kunci, kami juga mengubah tipe data (JSON) dari angka menjadi string.
Perhatikan bahwa JSON tidak membedakan antara tipe numerik yang berbeda. Ini hanya memiliki satu tipe numerik:angka.
Tombol dengan Spasi
Dalam contoh ini, saya mengganti nama kunci yang ada menjadi kunci baru yang berisi spasi (terdiri dari dua kata, dipisahkan oleh spasi).
Karena kunci baru berisi spasi, saya perlu mengapit kunci dengan tanda kutip ganda. Jika saya tidak melakukan ini, kesalahan akan terjadi.
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Population":68}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$."Average IQ"', CAST(JSON_VALUE(@data,'$.Population') AS int)), '$.Population', NULL ) -- Print the new JSON PRINT @data
Hasil:
{"Population":68} {"Average IQ":68}
Properti Bersarang
Jika properti bersarang, tidak masalah. Cukup gunakan notasi titik untuk merujuknya.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' PRINT @data SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Suspect.Qualifications', JSON_QUERY(@data,'$.Suspect.Hobbies')), '$.Suspect.Hobbies', NULL ) PRINT @data
Hasil:
{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } { "Suspect": { "Name": "Homer Simpson" ,"Qualifications":["Eating", "Sleeping", "Base Jumping"]} }
Anda mungkin juga memperhatikan bahwa contoh ini menggunakan JSON_QUERY()
fungsi untuk mengekstrak nilai, bukan JSON_VALUE()
seperti pada contoh sebelumnya.
Ini karena dalam hal ini kita mengekstrak array dan JSON_VALUE()
tidak dapat mengekstrak seluruh array (hanya dapat mengekstrak nilai skalar dari array). JSON_QUERY()
fungsi, di sisi lain, mengekstrak objek dan array, tetapi bukan nilai skalar.
Untuk membaca lebih lanjut tentang ini, lihat JSON_QUERY()
vs JSON_VALUE()
:Apa Bedanya?