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

Làm cách nào để lấy giá trị CDATA từ xml

Chức năng trích xuất đã không được chấp nhận trong một thời gian dài (ít nhất là kể từ khi 11gR2 - xem ghi chú trong tài liệu đó).

Nếu bạn có nhiều giá trị và có thể muốn xem nhiều giá trị, bạn có thể sử dụng XMLTable để loại bỏ nhiễu CDATA (nhưng có thể cần cắt bớt vì bạn có khoảng trắng trong các giá trị):

select x.stu_name, x.birthday,
  trim(stu_name) as stu_name2, to_char(x.birthday,'YYYY-MM-DD') as birthday2
from your_table t
cross join xmltable ('/RESPONSE/INFO' passing t.doc
  columns
    stu_name varchar2(30) path 'STU_NAME',
    birthday date path 'BIRTHDAY'
) x
where x.stu_name like '%M%'
STU_NAME BIRTHDAY  STU_NAME2 BIRTHDAY2
-------- --------- --------- ---------
 Maria   12-MAR-12 Maria     2012-03-12

Nếu bạn đang nhắm mục tiêu một giá trị duy nhất, bạn cũng có thể sử dụng xmlquery, gần với phần trích xuất của bạn hơn:

select regexp_replace(
  xmlquery('/RESPONSE/INFO[contains(BIRTHDAY, "2012-03-12")]/STU_NAME/text()'
    passing doc
    returning content),
  '<!\[CDATA\[ *(.*?) *\]\]>', '\1') as stu_name
from your_table t
STU_NAME
--------
Maria

Đây là tôi đã tìm ngày sinh mà bạn muốn dưới dạng văn bản trong một nút và có tên phù hợp; nhưng vì nó vẫn có CDATA, nó gần giống với những gì bạn có. Vì vậy, tôi đã sử dụng một biểu thức chính quy để loại bỏ phần CDATA, mặc dù bạn cũng có thể sử dụng substr / hướng dẫn nếu hiệu suất là vấn đề đáng lo ngại.

db <> fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra xem ngày hiện tại có nằm giữa hai ngày Oracle SQL không

  2. làm thế nào để tăng chiều dài đầu ra cột sqlplus?

  3. nhibernate, gọi hàm trong Oracle trả về con trỏ hệ thống

  4. Thủ tục hoặc công việc Oracle để sao chép dữ liệu tự động từ một lược đồ này sang một lược đồ khác dựa trên dòng thời gian

  5. JDBC kết nối với cơ sở dữ liệu Oracle bằng SSL