Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Mengganti Nama Kunci JSON di SQL Server (T-SQL)

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kapan saya harus menggunakan variabel tabel vs tabel sementara di server sql?

  2. Pilih 10 catatan teratas untuk setiap kategori

  3. Cara melihat riwayat kueri di SQL Server Management Studio

  4. Kesalahan:Pernyataan INSERT EXEC tidak dapat disarangkan. dan Tidak dapat menggunakan pernyataan ROLLBACK dalam pernyataan INSERT-EXEC. Bagaimana cara mengatasi ini?

  5. Pernyataan CASE dalam klausa WHERE di SQL Server 2008