Сравнение операторов XQuery с XML-данными

Применимо к: SQL Server (все поддерживаемые версии)

XQuery поддерживает следующие операторы:

  • числовые операторы (+, -, *, div, mod);

  • операторы сравнения значений (eq, ne, lt, gt, le, ge);

  • Операторы для общего сравнения ( =, !=, <, = ><, =, >= )

Дополнительные сведения об этих операторах см. в разделе "Выражения сравнения" (XQuery)

Примеры

A. Использование общих операторов

Этот запрос иллюстрирует использование общих операторов, применяемых к последовательностям, а также при сравнении последовательностей. Запрос получает последовательность телефонных номеров для каждого клиента из столбца AdditionalContactInfo таблицы Contact . Далее эта последовательность сравнивается с последовательностью двух телефонных номеров (111-111-1111, 222-2222).

Запрос использует = оператор сравнения. Каждый узел в последовательности справа = от оператора сравнивается с каждым узлом в последовательности слева. Если узлы совпадают, сравнение узлов равно TRUE. Затем оно конвертируется в тип данных int и сравнивается с 1, а запрос возвращает идентификатор заказчика.

WITH XMLNAMESPACES (  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS ACI,  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)  
SELECT ContactID   
FROM   Person.Contact  
WHERE  AdditionalContactInfo.value('  
      //ACI:AdditionalContactInfo//ACT:telephoneNumber/ACT:number =   
          ("111-111-1111", "222-2222")',  
      'bit')= cast(1 as bit)  

Существует еще один способ узнать, как работает предыдущий запрос: каждое значение номера телефона, полученное из столбца AdditionalContactInfo , сравнивается с набором двух телефонных номеров. Если значение входит в набор, в результате запроса возвращается этот заказчик.

Б. Использование числового оператора

Оператор + в данном запросе является оператором значения, так как он применяется к одному объекту. К примеру, значение 1 добавляется к размеру лота, возвращаемому этим запросом.

SELECT ProductModelID, Instructions.query('  
     declare namespace   
 AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
     for $i in (/AWMI:root/AWMI:Location)[1]  
     return   
       <Location LocationID="{ ($i/@LocationID) }"  
                   LotSize  = "{  number($i/@LotSize) }"  
                   LotSize2 = "{ number($i/@LotSize) + 1 }"  
                   LotSize3 = "{ number($i/@LotSize) + 2 }" >  
  
       </Location>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

В. Использование оператора значения

Следующий запрос извлекает <Picture> элементы для модели продукта, где размер рисунка имеет значение small:

SELECT CatalogDescription.query('  
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     for $P in /PD:ProductDescription/PD:Picture[PD:Size eq "small"]  
     return  
           $P  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

Так как оба операнда оператора eq являются атомарными значениями, оператор значения используется в запросе. Вы можете написать тот же запрос с помощью общего оператора сравнения ( = ).

См. также:

Функции XQuery для типа данных xml
XML-данные (SQL Server)
Справочник по языку XQuery (SQL Server)