IN và KHÔNG IN cho cột XML


8

Tôi có một bảng với một cột xml. Xml tương tự như

<Root>
  <Row>
    <user>abc</user>
    <Rowid>1</Rowid>
  </Row>
  <Row>
    <user>vf</user>
    <Rowid>2</Rowid>
  </Row>
  <Row>
    <user>ert</user>
    <Rowid>3</Rowid>
  </Row>
  <Maxrowid>3</Maxrowid>
</Root>

Bây giờ bên dưới truy vấn trả về cột sl_no và myxmlcolumn của các hàng chứa cột xml có giá trị 'abc' hoặc 'xyz' trong nút 'user' (). Bên dưới truy vấn tôi đang sử dụng tương tự tùy chọn IN của sql.

SELECT
    [mytable].[Sl_no],
    [mytable].[myxmlcolumn]
    FROM [mydb].dbo.[mytable]
    WHERE
        [myxmlcolumn].exist('for $x in /Root/Row where (($x/user[fn:upper-case(.)=(''ABC'',''XYZ'')])) return $x') > 0

Tôi muốn loại truy vấn tương tự hoạt động tương tự như sql 'NOT IN'. Đó là trong trường hợp của tôi, tôi muốn các hàng không có giá trị 'abc' hoặc 'xyz' trong nút 'user' () trong cột xml. Vì vậy, xin vui lòng giúp tôi về điều này.

Câu trả lời:


12

Các tồn tại () Phương pháp (xml Data Type) trả về một bit.
1nếu ít nhất một nút được tìm thấy và 0nếu không tìm thấy nút nào (tập kết quả trống).

Để có được các hàng không ABChoặc XYZtồn tại, bạn chỉ cần so sánh kết quả existvới 0.

[myxmlcolumn].exist('for $x in /Root/Row 
                     where (($x/user[fn:upper-case(.)=(''ABC'',''XYZ'')])) 
                     return $x') = 0

Thay vào đó, truy vấn FLWOR của bạn có thể được viết lại bằng cách sử dụng một vị ngữ trên nút người dùng,

select Sl_no,
       myxmlcolumn
from mytable
where myxmlcolumn.exist('/Root/Row/user[fn:upper-case(text()[1]) = ("ABC", "XYZ")]') = 0

Và đối với INphiên bản của truy vấn bạn kiểm tra nếu existtrả về 1thay thế.

select Sl_no,
       myxmlcolumn
from mytable
where myxmlcolumn.exist('/Root/Row/user[fn:upper-case(text()[1]) = ("ABC", "XYZ")]') = 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.