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

Phân tích cú pháp Json bằng Oracle SQL - JSON_TABLE

Có vẻ như bạn muốn kết hợp chéo các giá trị mảng (được nhóm theo rownumname ). Đây không phải là cấu trúc JSON tiêu chuẩn, vì vậy bạn không nên mong đợi có thể thực hiện điều này với một ứng dụng duy nhất của json_table .

Đây là một cách để thực hiện việc này với hai lệnh gọi tới json_table . Trong lần gọi đầu tiên, bạn sử dụng một đường dẫn lồng nhau để chỉ lấy tên, nhưng bạn vẫn giữ các mảng địa chỉ. Trong cuộc gọi thứ hai, bạn giải nén các địa chỉ, riêng biệt cho từng hàng được tạo bởi cuộc gọi đầu tiên.

Lưu ý việc sử dụng gợi ý trình tối ưu hóa trong select bên ngoài . Điều này là cần thiết, bởi vì nếu không có nó, trình tối ưu hóa sẽ thử "unnesting" bất hợp pháp của liên kết bên (outer apply ) và sau đó đưa ra một lỗi, thay vì để nguyên truy vấn. (Đây là một thói quen rất phổ biến và khó chịu của trình tối ưu hóa:nó thử một thứ gì đó không hợp lệ, và sau đó nó phàn nàn về điều đó.)

Ngoài ra, rownum là một từ khóa dành riêng - bạn không thể sử dụng nó làm tên cột trong đầu ra. (Về mặt kỹ thuật, bạn có thể, với công việc bổ sung, nhưng tốt nhất là bạn nên tin rằng bạn không thể.)

with
  t as (
    select * 
    from   json_Table(
'{
 "Rownum": "1",
 "Name": "John",
 "AddressArray":["Address1", "Address2"],
 "TextObj":[{"mName" : "Carol","lName" : "Cena"},
            {"mName" : "Mark","lName" : "Karlo"}
           ]
}', 
           '$' columns (
                 rownr        number                     path '$.Rownum', 
                 name         varchar2(100)              path '$.Name', 
                 addressArray varchar2(4000) format json path '$.AddressArray',
                 nested path '$.TextObj[*]'
                   columns  (mName varchar2(100) path '$.mName',
                             lName varchar2(100) path '$.lName'
                            )
               )
           )
  )
select /*+ no_query_transformation */ rownr, name, mname, lname, address
from t
     outer apply
     json_table (t.addressArray, '$[*]'
                   columns (address varchar2(10) path '$')
     )
;

Đầu ra:

ROWNR NAME   MNAME  LNAME  ADDRESS   
----- ------ ------ ------ ----------
    1 John   Carol  Cena   Address1  
    1 John   Carol  Cena   Address2  
    1 John   Mark   Karlo  Address1  
    1 John   Mark   Karlo  Address2 


  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 SQL:chọn từ all_tab_columns không tìm thấy cột hiện có

  2. Làm thế nào để bạn làm việc trên các gói Oracle trong một môi trường hợp tác, được kiểm soát bởi phiên bản?

  3. cách tạo bảng kế thừa trong oracle

  4. Sử dụng thủ tục được lưu trữ Oracle PL / SQL để cấp quyền trên bảng của người dùng khác

  5. Truy vấn SQL:Trả về bản ghi giá trị tối đa của một nhóm