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

JSON_QUERY() vs JSON_VALUE() di SQL Server:Apa Bedanya?

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 tipe nvarchar(max)
  • JSON_VALUE() mengembalikan nilai teks tunggal jenis nvarchar(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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi SQL Server Sederhana untuk Memecahkan Masalah Dunia Nyata

  2. Nama file SQL Server vs versi

  3. Permintaan sql untuk tabel pohon

  4. Log Transaksi SQL Server, Bagian 3:Dasar-dasar Pencatatan

  5. CEILING() Contoh di SQL Server