Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Parsing Json menggunakan Oracle SQL - JSON_TABLE

Anda sepertinya menginginkan gabungan silang dari nilai array (dikelompokkan berdasarkan rownum dan name ). Ini bukan struktur JSON standar, jadi Anda seharusnya tidak berharap dapat melakukan ini dengan satu aplikasi json_table .

Berikut adalah salah satu cara untuk melakukan ini dengan dua panggilan ke json_table . Pada panggilan pertama, Anda menggunakan jalur bersarang untuk mendapatkan nama saja, tetapi Anda masih menyimpan larik alamat. Dalam panggilan kedua, Anda membongkar alamat, secara terpisah untuk setiap baris yang dihasilkan oleh panggilan pertama.

Perhatikan penggunaan petunjuk pengoptimal di select luar . Ini diperlukan, karena tanpanya pengoptimal akan mencoba "unnesting" ilegal dari gabungan lateral (outer apply ) dan kemudian melontarkan kesalahan, alih-alih membiarkan kueri apa adanya. (Ini adalah kebiasaan pengoptimal yang sangat umum dan menjengkelkan:ia mencoba sesuatu yang tidak valid, lalu mengeluhkannya.)

Juga, rownum adalah kata kunci yang dicadangkan - Anda tidak dapat menggunakannya sebagai nama kolom di output. (Secara teknis Anda bisa, dengan pekerjaan tambahan, tetapi yang terbaik adalah percaya bahwa Anda tidak bisa.)

with
  t as (
    select * 
    from   json_Table(
'{
 "Rownum": "1",
 "Name": "John",
 "AddressArray":["Address1", "Address2"],
 "TextObj":[{"mName" : "Carol","lName" : "Cena"},
            {"mName" : "Mark","lName" : "Karlo"}
           ]
}', 
           '$' columns (
                 rownr        number                     path '$.Rownum', 
                 name         varchar2(100)              path '$.Name', 
                 addressArray varchar2(4000) format json path '$.AddressArray',
                 nested path '$.TextObj[*]'
                   columns  (mName varchar2(100) path '$.mName',
                             lName varchar2(100) path '$.lName'
                            )
               )
           )
  )
select /*+ no_query_transformation */ rownr, name, mname, lname, address
from t
     outer apply
     json_table (t.addressArray, '$[*]'
                   columns (address varchar2(10) path '$')
     )
;

Keluaran:

ROWNR NAME   MNAME  LNAME  ADDRESS   
----- ------ ------ ------ ----------
    1 John   Carol  Cena   Address1  
    1 John   Carol  Cena   Address2  
    1 John   Mark   Karlo  Address1  
    1 John   Mark   Karlo  Address2 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengonversi nomor menjadi tanggal di oracle

  2. Dapatkan hanya tanggal tanpa waktu di Oracle

  3. cx_Oracle tidak terhubung saat menggunakan SID alih-alih nama layanan pada string koneksi

  4. aplikasi asp.net tidak terhubung ke oracle 11g bahkan setelah menginstal klien instan oracle untuk 11g

  5. melakukan perhitungan pada data dalam tipe tabel