我将以下格式的数据存储在表的CLOB字段中-
{
"key" : "PRODUCT_NAME",
"value" : "Myproduct"
}, {
"key" : "PRODUCT_TYPE",
"value" : "Electronics"
}, {
"key" : "PRODUCT_PRICE",
"value" : "123456789.1"
}
我想将它们存储在将包含列PRODUCT_NAME
,PRODUCT_TYPE
,PRODUCT_PRICE
的表中,并将它们存储为
PRODUCT_NAME PRODUCT_TYPE PRODUCT_PRICE
MyProduct Electronics 123456789.1
我想使用Pl / SQL执行这些操作。这里有指针吗?
答案 0 :(得分:2)
您使用的CLOB
字段不是有效的JSON,因此您不能直接使用JSON函数。您需要遍历JSON documentation,并了解如何将json存储在数据库表中,以便更轻松地使用它们。一个适合您的解决方案是先解析各个json,然后在每个json上应用JSON_OBJECT
。此外,您需要一个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 :(得分:0)
尝试使用PL / JSON,它具有用于JSON解析https://pljson.github.io/pljson/的各种功能和过程