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

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

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

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

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

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

Примеры

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

Этот запрос иллюстрирует использование общих операторов, применяемых к последовательностям, а также при сравнении последовательностей. Этот запрос извлекает последовательность телефонных номеров для каждого заказчика из столбца AdditionalContactInfo таблицы Person. Далее эта последовательность сравнивается с последовательностью двух телефонных номеров (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 BusinessEntityID 
FROM   Person.Person
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 представляют собой атомарные значения, поэтому в данном запросе используется оператор значений. Тот же запрос можно сформулировать с помощью общего оператора сравнения (=).