Trong MariaDB, EXTRACTVALUE()
là một hàm chuỗi tích hợp trả về CDATA từ một phân đoạn XML.
Cách thức hoạt động là nó chấp nhận hai đối số chuỗi:một đoạn đánh dấu XML và một biểu thức XPath (tức là một bộ định vị). EXTRACTVALUE()
sau đó trả về CDATA (tức là văn bản) của nút văn bản đầu tiên là nút con của phần tử hoặc các phần tử khớp với biểu thức XPath.
Cú pháp
Cú pháp như sau:
EXTRACTVALUE(xml_frag, xpath_expr)
Ở đâu xml_frag
là phân đoạn XML và xpath_expr
là biểu thức XPath để đối sánh.
Ví dụ
Đây là một ví dụ cơ bản:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | Cat | +--------+
Trong trường hợp này, XPath là /type
và do đó nó trả về CDATA (văn bản) từ loại type
phần tử.
Đây là một cái khác:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | Homer | +--------+
Trong trường hợp này, XPath là /user
và vì vậy EXTRACTVALUE()
trả về CDATA từ user
phần tử.
Lưu ý rằng nó không trả về iq
phần tử hoặc văn bản của nó. Điều đó được mong đợi, bởi vì EXTRACTVALUE()
chỉ trả về CDATA. Nó không trả về bất kỳ phần tử con nào hoặc bất kỳ văn bản nào mà chúng có thể chứa.
Sử dụng biểu thức text ()
Nó tương đương với việc nhận được một kết quả phù hợp bằng cách thêm vào text()
rõ ràng biểu thức:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | Cat | +--------+
Các phần tử lồng nhau
Dưới đây là một ví dụ về việc lấy CDATA từ một phần tử lồng nhau:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | Low | +--------+
Ở đây, chúng tôi nhận được CDATA từ iq
phần tử được lồng bên trong user
thành phần. Chúng tôi đã đạt được điều này bằng cách sử dụng /user/iq
dưới dạng XPath.
Không phù hợp
Nếu không có phần tử nào như vậy tồn tại, không có gì được trả về.
Ví dụ:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | | +--------+
Đây cũng là trường hợp nếu bạn đặt sai lồng.
Ví dụ:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | | +--------+
Ở đây, chúng tôi đã sử dụng /iq
dưới dạng XPath mà lẽ ra chúng ta nên sử dụng /user/iq
.
XML trống
Một tài liệu XML trống sẽ tạo ra một kết quả trống:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Kết quả:
+--------+ | Result | +--------+ | | +--------+
XPath trống
XPath trống trả về lỗi:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Kết quả:
ERROR 1105 (HY000): XPATH syntax error: ''
Null XML
Cung cấp null
vì đối số đầu tiên dẫn đến lỗi:
SELECT EXTRACTVALUE(null, '');
Kết quả:
ERROR 1105 (HY000): XPATH syntax error: ''
XPath không có giá trị
Cung cấp null
khi đối số thứ hai trả về null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Kết quả:
+--------+ | Result | +--------+ | NULL | +--------+
Chỉ đưa ra một lập luận
Việc cung cấp một đối số duy nhất dẫn đến lỗi:
SELECT EXTRACTVALUE('<type>Cat</type>');
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Thiếu đối số
Gọi EXTRACTVALUE()
mà không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT EXTRACTVALUE();
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Giới thiệu về XML
Để biết thêm về XML, hãy xem Hướng dẫn về XML của tôi tại Quackit. Hướng dẫn đó cũng bao gồm Giới thiệu về XPath.