Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Phân tích cú pháp dữ liệu JSON từ trường CLOB bằng PL / SQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQLDeveloper trên MacOS sẽ không mở sau khi cài đặt đúng Java

  2. cách kiểm tra tất cả các ràng buộc trên bảng trong oracle

  3. R tới Kết nối Oracle bằng ODBC

  4. Từ khóa 'as' có được yêu cầu trong Oracle để xác định bí danh không?

  5. Tại sao một từ đồng nghĩa Oracle lại trả về một số hàng khác nhau cho bảng bên dưới?