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

XMLTABLE trong PostgreSQL

Tôi vừa cam kết một bản vá của Pavel Stěhule có thêm XMLTABLE chức năng của PostgreSQL 10. XMLTABLE là một tính năng rất hữu ích được quy định bởi tiêu chuẩn SQL / XML, cho phép bạn chuyển dữ liệu XML của mình thành dạng quan hệ, để bạn có thể trộn nó với phần còn lại của dữ liệu quan hệ của mình. Tính năng này có nhiều công dụng; tiếp tục đọc để biết một số chi tiết về nó.

Có lẽ là trường hợp sử dụng thú vị nhất của XMLTABLE là trích xuất dữ liệu từ một số tài liệu XML để chèn vào một bảng quan hệ, trong quá trình xử lý ETL trong cơ sở dữ liệu. Tuy nhiên, XMLTABLE có thể được sử dụng nhanh chóng trên dữ liệu được lưu trữ trong các cột XML, do đó khi dữ liệu ở dạng quan hệ, bạn có thể áp dụng bất kỳ hoạt động tiêu chuẩn nào bạn muốn, chẳng hạn như thêm WHERE mệnh đề, thực hiện tổng hợp, kết hợp với các bảng khác, v.v.

Một ví dụ đơn giản

Ví dụ:giả sử bạn quản lý một chuỗi khách sạn và dữ liệu được lưu trữ như vậy:

  TẠO BẢNG Dữ liệu khách sạn NHƯ CHỌN xml $$    La Mancha     3   Khung cảnh tuyệt đẹp của Kênh     5       Ferdinando Quijana   45000       Valparaíso     2   Rất ồn ào     2       Katharina Wuntz   50000     Diego Velázquez   1200000      $$ AS Hotels;  

Với XMLTABLE , Bạn có thể biến bảng này thành một bảng có định dạng quan hệ bao gồm số phòng và sức chứa, chú thích cho từng khách sạn trong chuỗi của bạn:

  SELECT xmltable. * FROM hoteldata, XMLTABLE ('/ Hotels / hotel / Rooms / room' PASSING hotel id FOR ORDINATIONAL, hotel_name text PATH '../../name' NOT NULL, room_id int PATH '@id' NOT NULL, dung lượng int, văn bản bình luận PATH 'bình luận' DEFAULT 'Một phòng thông thường');  
id hotel_name room_id dung lượng nhận xét
1 La Mancha 201 3 Khung cảnh tuyệt đẹp của Kênh
2 La Mancha 202 5 Phòng thông thường
3 Valparaíso 201 2 Rất ồn
4 Valparaíso 202 2 Phòng thông thường

Giải thích cú pháp

Hãy nghiên cứu truy vấn ở trên. XMLTABLE mệnh đề phải đi trong FROM một phần của truy vấn. Chúng tôi cũng có hoteldata trong FROM , đây là thứ cung cấp dữ liệu vào XMLTABLE .

Đầu tiên, PASSING là nơi chúng tôi chỉ định dữ liệu XML mà chúng tôi muốn xử lý. Trong trường hợp này, dữ liệu đến từ các khách sạn trong hoteldata bàn. Chúng tôi gọi đây là biểu thức tài liệu .

Ngay trước PASSING mệnh đề bạn thấy biểu thức XPath '/ Hotels / hotel / Rooms / room' . Chúng tôi gọi đây là biểu thức tạo hàng hoặc chỉ biểu thức hàng .

Chúng tôi có COLUMNS mệnh đề tiếp theo, khai báo một vài cột. Đối với mỗi cột, chúng tôi chỉ ra một kiểu dữ liệu cũng như một PATH tùy chọn mệnh đề mà chúng tôi gọi là biểu thức cột .

XMLTABLE Lý thuyết hoạt động của ‘s là biểu thức hàng được áp dụng cho biểu thức tài liệu, cắt tài liệu thành nhiều phần để tạo ra các hàng; đối với mỗi hàng được tạo như vậy, các biểu thức cột khác nhau được áp dụng để nhận các giá trị cho mỗi cột.

Biểu thức cột là một biểu thức XPath nhận một giá trị bắt đầu từ XML cho hàng hiện tại. Nếu không có PATH được chỉ định, sau đó chính tên cột được sử dụng làm biểu thức XPath. Lưu ý rằng trong cột hotel_name chúng tôi đã sử dụng một đường dẫn có “ ../ “, Có nghĩa là“ đi lên ”trong tài liệu XML để lấy các giá trị từ các đối tượng“ vùng chứa ”trong tài liệu. Chúng tôi cũng có thể sử dụng xml PATH '.' liên tiếp, cung cấp cho chúng tôi toàn bộ nguồn XML cho hàng đó.

Một cột có thể được đánh dấu CHO TÍNH HIỆU QUẢ . Sau đó, cột thuộc loại INTEGER , và được đánh số tuần tự cho mỗi hàng thu được từ tài liệu. (Nếu có nhiều tài liệu đầu vào, chẳng hạn như khi bạn có nhiều hàng trong bảng, bộ đếm bắt đầu từ 1 cho mỗi tài liệu mới).

Ngoài ra còn có một DEFAULT mệnh đề. Nếu XPath cho một cột không khớp với giá trị cho một hàng nhất định, thì DEFAULT giá trị được sử dụng.

Một số cột trong số này đã được đánh dấu là KHÔNG ĐẦY ĐỦ . Nếu không có kết quả phù hợp và không có DEFAULT mệnh đề được chỉ định (hoặc DEFAULT cũng đánh giá là NULL ), một lỗi được đưa ra.

Tôi sẽ không đi vào chi tiết hơn về XPath, là một ngôn ngữ mạnh mẽ, nhưng tôi có thể cung cấp bài viết XPath trên Wikipedia và tài liệu đề xuất chính thức từ W3C như những tài nguyên hữu ích.

Cú pháp XMLTABLE đầy đủ

Tóm tắt cú pháp được tài liệu hóa là:

  xmltable  ([XMLNAMESPACES (  không gian tên uri   AS   tên không gian tên   [, ...])]   row_expression   PASSING [BY REF]   document_expression   [BY REF] COLUMNS   name   {  type   [PATH   column_expression   ] [DEFAULT   expr   ] [KHÔNG NULL | NULL] | ĐỐI VỚI ĐƠN HÀNG} [, ...]) 

Lưu ý rằng biểu thức tài liệu có thể là một tham chiếu đến một số bảng mà bạn có trong mệnh đề FROM, hoặc nó có thể là một tài liệu XML hoàn chỉnh dưới dạng một chuỗi ký tự. Các điều khoản BY REF không có bất kỳ hiệu lực nào; chúng ở đó để tương thích với tiêu chuẩn và với các hệ thống cơ sở dữ liệu khác.

Tôi chưa bao gồm XMLNAMESPACES mệnh đề trong bài đăng này; Tôi sẽ để nó cho một phần trong tương lai.

Áp dụng SQL trên đầu trang

Như đã đề cập, một khi XMLTABLE đã xử lý dữ liệu thành dạng quan hệ, bạn có thể làm bất cứ điều gì bạn muốn bằng cách sử dụng các công cụ nổi tiếng. Ví dụ:nếu bạn có một tài liệu XML khác với nhiều nhân sự hơn trong mỗi khách sạn,

 CHÈN VÀO GIÁ TRỊ dữ liệu khách sạn (xml $$    La Mancha     Sancho Panza   35000       Valparaíso    khách sạn   tiền tệ   sum     Valparaíso   CLP   1200000     Valparaíso   EUR   80000     La Mancha   PTA   80000     

Kết luận

Trong bài viết này, tôi đã đề cập đến tính năng mới XMLTABLE xuất hiện trong phiên bản PostgreSQL 10. Tôi nghĩ XMLTABLE là một tính năng tuyệt vời để tích hợp dữ liệu bên ngoài và tôi hy vọng bạn cũng thấy nó có giá trị. Vui lòng kiểm tra nó và báo cáo bất kỳ vấn đề nào để chúng tôi có thể sắp xếp chúng trước khi phát hành cuối cùng. Nếu bạn thích XMLTABLE , hãy cho chúng tôi biết để lại nhận xét!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django:quyền bị từ chối khi cố gắng truy cập cơ sở dữ liệu sau khi khôi phục (di chuyển)

  2. Thêm khoảng thời gian vào dấu thời gian bằng cách sử dụng Phân đoạn Ecto

  3. Tương đương với univot () trong PostgreSQL

  4. Sử dụng regex ở WHERE trong Postgres

  5. Chuyển đổi từ không đồng bộ sang sao chép đồng bộ trong PostgreSQL