Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Analysieren von JSON-Daten aus dem CLOB-Feld mit PL/SQL

Der CLOB Das von Ihnen verwendete Feld ist kein gültiges JSON, daher können Sie die JSON-Funktionen nicht direkt verwenden. Sie müssen die JSON-Dokumentation durchgehen und verstehen, wie ein json in einer Datenbanktabelle gespeichert werden sollte, um die Verwendung zu vereinfachen. Eine Lösung für Sie wäre, zuerst die einzelnen JSONs zu parsen und dann JSON_OBJECT anzuwenden auf jedem json. Außerdem benötigen Sie einen PIVOT oder ein MAX(CASE) -Block, um die Zeilen in Spalten umzuwandeln. Diese Abfrage funktioniert in Oracle 12c und höher.

Beispieldaten

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; 

Abfrage

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