CLOB
trường bạn đang sử dụng không phải là JSON hợp lệ, vì vậy bạn không thể sử dụng trực tiếp các hàm JSON. Bạn cần xem qua tài liệu JSON
và hiểu cách json nên được lưu trữ trong bảng cơ sở dữ liệu để giúp sử dụng chúng dễ dàng hơn. Một giải pháp cho bạn sẽ là phân tích cú pháp các json riêng lẻ trước rồi áp dụng JSON_OBJECT
trên mỗi json. Hơn nữa, bạn sẽ cần một PIVOT
hoặc MAX(CASE)
để chuyển đổi các hàng thành cột. Truy vấn này hoạt động trong Oracle 12c trở lên.
Dữ liệu mẫu
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;
Truy vấn
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