Oracle
 sql >> база данни >  >> RDS >> Oracle

Разбор на JSON данни от CLOB поле с помощта на PL/SQL

CLOB полето, което използвате, не е валиден JSON, така че не можете да използвате JSON функциите директно. Трябва да прегледате JSON документацията и разберете как json трябва да се съхранява в таблица на база данни, за да се улесни използването им. Едно решение за вас би било първо да анализирате отделните json файлове и след това да приложите JSON_OBJECT на всеки json. Освен това ще ви трябва PIVOT или MAX(CASE) блок за преобразуване на редовете в колони. Тази заявка работи в Oracle 12c и по-нова версия.

Примерни данни

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; 

Заявка

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. Как да АКТУАЛИЗИРАТЕ една колона, като използвате друга колона в друга таблица? SQL грешка:ORA-00933:SQL командата не е приключила правилно

  2. Oracle-Преобразуване на SQL в ANSI SQL

  3. Oracle DB - Задаване на входно число на точна дължина

  4. Oracle:Как да открием прекратяване на процес на клиент, както работи за sqlplus?

  5. Ограничаване на вътрешна заявка с атрибут на външна заявка