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

Parsing data JSON dari bidang CLOB menggunakan PL/SQL

CLOB bidang yang Anda gunakan bukan JSON yang valid, jadi Anda tidak dapat menggunakan fungsi JSON secara langsung. Anda harus melalui dokumentasi JSON dan memahami bagaimana json harus disimpan dalam tabel database agar lebih mudah digunakan. Salah satu solusi untuk Anda adalah mem-parsing masing-masing json terlebih dahulu dan kemudian menerapkan JSON_OBJECT pada setiap json. Selanjutnya, Anda memerlukan PIVOT atau MAX(CASE) blok untuk mengubah baris menjadi kolom. Kueri ini berfungsi di Oracle 12c dan di atasnya.

Contoh data

CREATE TABLE t AS 
  SELECT 1   AS id, 
         To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct" }, {   "key" : "PRODUCT_TYPE",   "value" : "Electronics" }, {   "key" : "PRODUCT_PRICE",   "value" : "123456789.1" }') AS j 
  FROM   dual 
  UNION ALL 
  SELECT 2, 
         To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct2" }, {   "key" : "PRODUCT_TYPE",   "value" : "Chemical" }, {   "key" : "PRODUCT_PRICE",   "value" : "25637.1" }') 
  FROM   dual; 

Kueri

WITH jdt AS 
( 
       SELECT id, 
              JSON_VALUE(jsons,'$.key')   AS k,  -- gets the "key"
              JSON_VALUE(jsons,'$.value') AS v   -- gets the "value"
       FROM   ( 
                     SELECT id, 
                            REGEXP_SUBSTR(j,'(.*?)\}(,|$)',1,LEVEL,'n',1) 
                                   || '}' AS jsons --split the clob field into individual jsons
                     FROM   t 
                            CONNECT BY PRIOR id = id 
                     AND    PRIOR SYS_GUID() IS NOT NULL 
                     AND    LEVEL <= REGEXP_COUNT(j,'\}(,|$)') ) ) 
SELECT * 
FROM   jdt pivot ( max ( v ) FOR k IN ( 'PRODUCT_NAME', 
                                       'PRODUCT_TYPE', 
                                       'PRODUCT_PRICE' ) );

 ID PRODUCT_NAME PRODUCT_TYPE   PRODUCT_PRICE
 1  Myproduct    Electronics    123456789.1
 2  Myproduct2   Chemical       25637.1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Boolean di OracleDbType

  2. 2 Cara Mendapatkan Menit dari Nilai Datetime di Oracle Database

  3. String koneksi Oracle ODP.NET:apa yang terjadi di Sumber Data?

  4. Panggil prosedur tersimpan yang berisi kumpulan catatan menggunakan callproc dengan python

  5. kolom dinamis di Oracle menggunakan sql