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

JSON_QUERY() Contoh di SQL Server (T-SQL)

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_Documents

Hasil:

+----------+| 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 bernama Json_Documents .

Contoh 4 – Nilai Skalar

JSON_QUERY() fungsi tidak dirancang untuk mengembalikan nilai skalar. Jika Anda ingin mengembalikan nilai skalar, gunakan JSON_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 menggunakan JSON_QUERY() untuk mengembalikan seluruh larik (yang JSON_VALUE() tidak bisa melakukannya).

Contoh 5 – Mode Jalur

Seperti yang disebutkan, Anda juga memiliki opsi untuk menentukan mode jalur. Ini bisa berupa lax atau strict .

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membagi string menggunakan char pembatas menggunakan T-SQL?

  2. Mendaftar SQL Server dalam Transaksi XA Terdistribusi

  3. Cadangkan satu tabel dengan datanya dari database di sql server 2008

  4. SQL Server String atau data biner akan terpotong

  5. Mengonfigurasi Notifikasi Email Database di MS SQL Server