Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Parsowanie danych JSON z pola CLOB przy użyciu PL/SQL

CLOB używane pole nie jest prawidłowym kodem JSON, więc nie można bezpośrednio używać funkcji JSON. Musisz przejrzeć dokumentację JSON i zrozumieć, jak json powinien być przechowywany w tabeli bazy danych, aby ułatwić korzystanie z nich. Jednym z rozwiązań byłoby najpierw przeanalizować poszczególne jsons, a następnie zastosować JSON_OBJECT na każdym jsonie. Ponadto potrzebujesz PIVOT lub MAX(CASE) blok do konwersji wierszy na kolumny. To zapytanie działa w Oracle 12c i nowszych.

Przykładowe dane

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; 

Zapytanie

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. Zapytanie SQL, aby uzyskać pierwszą datę, w zależności od aktualnej grupy (~przerwa kontrolna)

  2. Dowiedz się, jakiego symbolu waluty używa Twoja sesja w Oracle

  3. Oracle CONNECT BY rekurencyjne zapytanie podrzędne do nadrzędnego, w tym nadrzędny nadrzędny, który odwołuje się do siebie

  4. Program ładujący sql - brak drugiego ciągu obudowy

  5. Jak wyświetlić wszystkie metadane kolumn tabeli w bazie danych Oracle?