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

Cara Mengembalikan Kunci Duplikat dari Dokumen JSON di SQL Server

Jika Anda mencoba mengekstrak nilai dari dokumen JSON, tetapi satu atau beberapa nilai pada tingkat yang sama memiliki kunci duplikat, Anda mungkin mengalami masalah jika mencoba mengekstrak nilai tersebut menggunakan JSON_QUERY() atau JSON_VALUE() .

Kedua fungsi tersebut hanya akan mengembalikan nilai pertama yang cocok dengan jalurnya.

Untungnya, ada pilihan lain.

OPENJSON() fungsi akan mengembalikan semua nilai dari kunci duplikat pada level yang sama.

Contoh

Berikut adalah contoh untuk mendemonstrasikan OPENJSON() mengembalikan properti duplikat pada level yang sama.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT * FROM OPENJSON(@json, '$.dog.details'); 

Hasil:

+-------+----------+--------+| kunci   | nilai    | ketik   ||-------+----------+--------|| nama  | Ambil    | 1      || nama  | Anjing Baik | 1      || seks   | laki-laki     | 1      |+-------+----------+--------+

Contoh ini mengembalikan semua anak dari $.dog.details kunci.

Dalam hal ini, kami memiliki dua kunci dengan nama yang sama pada level yang sama (name kunci).

Jika kita ingin mengembalikan hanya nilai dari dua name kunci, kita bisa melakukan sesuatu seperti berikut.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name'; 

Hasil:

+----------+| nilai    ||----------|| Ambil    || Anjing Baik |+----------+

JSON_VALUE() &JSON_QUERY()

Seperti yang disebutkan, keduanya JSON_VALUE() dan JSON_QUERY() hanya mengembalikan nilai pertama yang cocok dengan jalurnya.

Jadi jika kita mencoba menggunakannya terhadap dokumen JSON di atas, kita mendapatkan hasil sebagai berikut.

JSON_VALUE()

JSON_VALUE() mengembalikan nilai skalar dari string JSON, sehingga akan mengembalikan hasil berikut.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE]; 

Hasil:

+-------------+| JSON_VALUE   ||--------------|| Ambil        |+--------------+

JSON_QUERY()

JSON_QUERY() mengekstrak objek atau larik dari string JSON, sehingga akan mengembalikan hasil berikut.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY]; 

Hasil:

+-------------+| JSON_QUERY   ||--------------|| {                "name" :"Ambil",                 "name" :"Good Dog",                "sex" :"male"            }-----      |     

Setidaknya dengan JSON_QUERY() kita bisa melihat kunci duplikat, tetapi kita tidak mendapatkan nilai individualnya seperti yang kita dapatkan dengan OPENJSON() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah penyebaran laporan SSRS 2014

  2. SQL Server *=Operator?

  3. Bagaimana cara menyalin database SQL Azure ke server pengembangan lokal saya?

  4. Perbedaan waktu SQL antara dua tanggal menghasilkan jj:mm:dd

  5. INSTR() Setara di SQL Server