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

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

Saat menggunakan JSON dengan SQL Server, Anda dapat menggunakan JSON_VALUE() berfungsi untuk mengembalikan nilai skalar dari string JSON.

Untuk menggunakan fungsi ini, Anda memberikan dua argumen; ekspresi JSON, dan properti yang akan diekstrak.

Sintaks

Sintaksnya seperti ini:

JSON_VALUE ( expression , path )

Dimana expression adalah ekspresi string JSON, dan path adalah properti yang ingin Anda ekstrak dari ekspresi itu.

Argumen jalur dapat menyertakan mode jalur opsional komponen. Mode jalur opsional ini dapat berupa nilai lax atau strict . Nilai ini, jika ada, muncul sebelum tanda dolar.

Contoh 1 – Penggunaan Dasar

Berikut adalah contoh untuk mendemonstrasikan penggunaan dasar JSON_VALUE() fungsi.

SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';

Hasil:

+----------+
| Result   |
|----------|
| Bruce    |
+----------+

Dalam contoh ini:

  • The {"Name": "Bruce"} argumen adalah ekspresi JSON (yang kecil, tetapi masih merupakan ekspresi JSON yang valid). Ekspresi JSON terdiri dari pasangan kunci/nilai. Dalam hal ini, Name adalah kuncinya, Bruce adalah nilainya.
  • The $.Name argumen adalah jalan. Jalur ini mereferensikan nilai Name kunci ekspresi JSON. Jadi kita bisa mengekstrak nilainya dengan mereferensikan nama pasangannya.

Contoh 2 – Array

Untuk mengekstrak nilai dari array, referensikan indeksnya dalam tanda kurung siku, diikuti dengan kunci yang relevan. Ini contohnya:

/* 
CREATE THE ARRAY (and put into a variable called @data)
*/
DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'

/* 
QUERY THE ARRAY
*/
SELECT 
  JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
  JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
  JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
  JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'

UNION ALL

SELECT 
  JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
  JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
  JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
  JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';  

Hasil:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Jadi dalam contoh ini, kita membuat array JSON dan memasukkannya ke dalam variabel bernama @data . Kami kemudian menjalankan kueri, menggunakan @data sebagai argumen pertama dari JSON_VALUE() fungsi (ini karena @data berisi ekspresi JSON).

Array menggunakan penomoran berbasis nol, jadi untuk mengekstrak item pertama kita perlu menggunakan Cities[0] , yang kedua Cities[1] , dan seterusnya.

Contoh 3 – Contoh Basis Data

Jika kita memasukkan data dari contoh sebelumnya ke dalam database, kita dapat menulis ulang query sebagai berikut:

SELECT 
  JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name',
  JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code',
  JSON_VALUE(Document,'$.Cities[0].District') AS 'District',
  JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population'
FROM Json_Documents

UNION ALL

SELECT 
  JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name',
  JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code',
  JSON_VALUE(Document,'$.Cities[1].District') AS 'District',
  JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population'
FROM Json_Documents

Hasil:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Ini mengasumsikan bahwa dokumen JSON disimpan dalam kolom yang disebut Document , yang ada dalam tabel bernama Json_Documents .

Contoh 4 – 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_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';

Hasil:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

Dalam contoh ini kami mencoba mereferensikan Hobbies , tetapi kunci itu tidak ada di dokumen JSON. 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_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';

Hasil:

Msg 13608, Level 16, State 1, Line 1
Property cannot be found on the specified JSON path.

Seperti yang diharapkan, mode ketat menghasilkan pesan kesalahan yang ditampilkan.

Contoh 5 – Mengembalikan Objek dan Array

JSON_VALUE() fungsi tidak mengembalikan objek dan array. Jika Anda ingin mengembalikan objek atau larik, gunakan JSON_QUERY() fungsi sebagai gantinya. Berikut adalah contoh di mana saya menggunakan kedua fungsi dalam kueri.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Mae Sai",  
         "Province": "Chiang Rai",  
         "Country": "Thailand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
   JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country',
   JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
   JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';

Hasil:

+---------------+-----------+----------------------------------------+--------------+
| Name          | Country   | Hobbies                                | Last Hobby   |
|---------------+-----------+----------------------------------------+--------------|
| Homer Simpson | Thailand  | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
+---------------+-----------+----------------------------------------+--------------+

Dalam hal ini, saya menggunakan JSON_VALUE() untuk mengembalikan berbagai nilai skalar, dan JSON_QUERY() untuk mengembalikan array.

Jadi, jika Anda perlu mengembalikan objek atau larik (termasuk seluruh dokumen JSON), lihat JSON_QUERY() Contoh di SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendiagnosis Deadlock di SQL Server 2005

  2. Ganti nama Kunci Asing di SQL Server menggunakan T-SQL

  3. SQL Server Bergabung dengan Estimasi menggunakan Histogram Coarse Alignment

  4. Bagaimana Fungsi NCHAR() Bekerja di SQL Server (T-SQL)

  5. Mana yang lebih berkinerja, CTE atau tabel sementara?