2011-02-09 37 views
5

Có cách nào để thực hiện thao tác LIKE với XQuery giống như với SQL không?XQuery LIKE-operator?

Tôi không thể xây dựng một số cụm từ "bắt đầu", "kết thúc" và "chứa" - biểu hiện.

Ví dụ về những gì tôi muốn đạt được:

for $x in /user where $x/firstname LIKE '%xxx' return $x 
for $x in /user where $x/middlename LIKE 'xxx%' return $x 
for $x in /user where $x/lastname LIKE '%xxx%' return $x 

Có cách nào để đạt được điều này trong XQuery?

EDIT:

Có câu trả lời cho câu hỏi ở trên. Sự cố mới:

Có cách nào để làm điều này ngược lại không? Tôi muốn chạy các truy vấn đó với toán tử NOT LIKE tương đương sql. Điều này có thể không? Nó phải nằm trong biểu thức FLWOR

EDIT2:

Giải quyết vấn đề. Bạn có thể chạy fn: not (starts-with ('123', '1')) và nó trả về false.

+0

Tôi đang bối rối bởi ràng buộc "nó phải ở trong biểu thức FLWOR". Có gì sai với công thức đơn giản hơn '/ user [match (firstname, '. * Xxx')]'? Các biểu thức đường dẫn đơn giản thường ngắn gọn hơn các biểu thức FLWOR. –

+0

Đây là một câu hỏi hữu ích, mà bạn dường như đã tự trả lời, nhưng không cung cấp đầu ra. Bạn có thể đăng câu trả lời của mình ở đây không? Bạn có thể sử dụng cú pháp của chuỗi so sánh LIKE hay bạn phải dịch nó thành chuỗi so sánh cụ thể xQuery? – Ben

Trả lời

13

XPath 2.0 và XQuery 1.0 (như tiêu chuẩn của W3C) có hỗ trợ biểu thức chính quy với matches chức năng http://www.w3.org/TR/xpath-functions/#func-matches:

/user[matches(firstname, 'xxx$')] 

Và tất nhiên có những chức năng như starts-withcontains (cả trong XPath 1.0/2.0) và ends-with (chỉ trong XPath 2.0) có thể đủ.

+0

Điều đó giải quyết được vấn đề. –

+0

@Martin Honnen: +1 Câu trả lời hay. Đã chỉnh sửa vì câu cuối cùng có thể gây nhầm lẫn. –

+3

XPath 1.0 tương đương với hàm XPath 2.0 kết thúc bằng ': 'chuỗi con ($ string, string-length ($ string) - string-length ($ pattern) + 1) = $ pattern' –

Các vấn đề liên quan