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