sql >> Databáze >  >> RDS >> Oracle

Analýza dat JSON z pole CLOB pomocí PL/SQL

CLOB pole, které používáte, není platný JSON, takže nemůžete používat funkce JSON přímo. Musíte si projít dokumentaci JSON a porozumět tomu, jak by měl být soubor json uložen v databázové tabulce, aby bylo snazší je používat. Jedním z řešení pro vás by bylo nejprve analyzovat jednotlivé soubory json a poté použít JSON_OBJECT na každém json. Dále budete potřebovat PIVOT nebo MAX(CASE) blok pro převod řádků na sloupce. Tento dotaz funguje v Oracle 12c a vyšším.

Ukázková 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; 

Dotaz

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. Chyba nesprávné hodnoty řetězce MySQL při ukládání řetězce unicode v Django

  2. Příkaz a podmínky dotazu Oracle SQL s časovými razítky a daty ISO

  3. MySQL #1364 - Pole 'column_name' nemá výchozí hodnotu - Nelze vložit do DB

  4. Hibernace parametrizovaného SQL dotazu pomalé a aktivní relace oracle