Udostępnij przez


Wyrażenia porównania (XQuery)

Dotyczy:SQL Server

Funkcja XQuery udostępnia następujące typy operatorów porównania:

  • Ogólne operatory porównania

  • Operatory porównania wartości

  • Operatory porównania węzłów

  • Operatory porównania kolejności węzłów

Ogólne operatory porównania

Ogólne operatory porównania mogą służyć do porównywania wartości niepodzielnych, sekwencji lub dowolnej kombinacji tych dwóch.

Operatory ogólne są zdefiniowane w poniższej tabeli.

Obsługujący Opis
= Równe
!= Nierówne
< Mniejsze niż
> Większe niż
<= Mniej lub równe
>= Większe niż lub równe

Podczas porównywania dwóch sekwencji przy użyciu operatorów porównania ogólnego i wartość istnieje w drugiej sekwencji, która porównuje wartość True z wartością w pierwszej sekwencji, ogólny wynik to True. W przeciwnym razie jest to Fałsz. Na przykład (1, 2, 3) = (3, 4) ma wartość True, ponieważ wartość 3 jest wyświetlana w obu sekwencjach.

declare @x xml  
set @x=''  
select @x.query('(1,2,3) = (3,4)')    

Porównanie oczekuje, że wartości są porównywalne typy. W szczególności są one statycznie sprawdzane. W przypadku porównań liczbowych może wystąpić podwyższenie poziomu typu liczbowego. Jeśli na przykład wartość dziesiętna 10 jest porównywana z podwójną wartością 1e1, wartość dziesiętna zostanie zmieniona na dwukrotnie. Należy pamiętać, że może to spowodować utworzenie wyników niewykonanych, ponieważ podwójne porównania nie mogą być dokładne.

Jeśli jedna z wartości jest nietypowa, jest rzutowana na typ innej wartości. W poniższym przykładzie wartość 7 jest traktowana jako liczba całkowita. Przed porównaniem nietypowa wartość /a[1] jest konwertowana na liczbę całkowitą. Porównanie liczb całkowitych zwraca wartość True.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < 7')  

Z drugiej strony, jeśli nietypowa wartość jest porównywana z ciągiem lub inną nietypową wartością, zostanie ona rzutowana na ciąg xs:string. W poniższym zapytaniu ciąg 6 jest porównywany z ciągiem "17". Poniższe zapytanie zwraca wartość False ze względu na porównanie ciągów.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < "17"')  

Poniższe zapytanie zwraca małe obrazy modelu produktu z katalogu produktów udostępnionego w przykładowej bazie danych AdventureWorks. Zapytanie porównuje sekwencję wartości niepodzielnych zwracanych przez PD:ProductDescription/PD:Picture/PD:Size pojedynczą sekwencję "małą". Jeśli porównanie ma wartość True, zwraca <element Obraz> .

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

Poniższe zapytanie porównuje sekwencję numerów telefonów w <elementach liczbowych> z literałem ciągu "112-111-1111". Zapytanie porównuje sekwencję elementów numeru telefonu w kolumnie AdditionalContactInfo, aby określić, czy w dokumencie istnieje określony numer telefonu dla określonego klienta.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.value('         
   /aci:AdditionalContactInfo//act:telephoneNumber/act:number = "112-111-1111"', 'nvarchar(10)') as Result         
FROM Person.Contact         
WHERE ContactID=1         

Zapytanie zwraca wartość True. Oznacza to, że liczba istnieje w dokumencie. Poniższe zapytanie jest nieco zmodyfikowaną wersją poprzedniego zapytania. W tym zapytaniu wartości numeru telefonu pobrane z dokumentu są porównywane z sekwencją dwóch wartości numeru telefonu. Jeśli porównanie ma wartość True, <zwracany jest element number> .

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.query('         
  if (/aci:AdditionalContactInfo//act:telephoneNumber/act:number = ("222-222-2222","112-111-1111"))         
  then          
     /aci:AdditionalContactInfo//act:telephoneNumber/act:number         
  else         
    ()') as Result         
FROM Person.Contact         
WHERE ContactID=1  
  

Jest to wynik:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    112-111-1111  
\</act:number>   

Operatory porównania wartości

Operatory porównania wartości służą do porównywania wartości niepodzielnych. Należy pamiętać, że w zapytaniach można używać operatorów porównania ogólnego zamiast operatorów porównania wartości.

Operatory porównania wartości są zdefiniowane w poniższej tabeli.

Obsługujący Opis
Eq Równe
Ne Nierówne
Lt Mniejsze niż
Gt Większe niż
Le Mniej lub równe
Ge Większe niż lub równe

Jeśli dwie wartości porównają to samo zgodnie z wybranym operatorem, wyrażenie zwróci wartość True. W przeciwnym razie zwróci wartość False. Jeśli którakolwiek z wartości jest pustą sekwencją, wynik wyrażenia to False.

Te operatory działają tylko na pojedynczych wartościach niepodzielnych. Oznacza to, że nie można określić sekwencji jako jednego z operandów.

Na przykład następujące zapytanie pobiera <elementy obrazów> dla modelu produktu, w którym rozmiar obrazu jest "mały:

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         

Zwróć uwagę na następujące elementy z poprzedniego zapytania:

  • declare namespace definiuje prefiks przestrzeni nazw, który jest następnie używany w zapytaniu.

  • Wartość elementu Size< jest porównywana >z określoną wartością atomową "small".

  • Należy pamiętać, że ponieważ operatory wartości działają tylko na wartościach niepodzielnych, funkcja data() jest niejawnie używana do pobierania wartości węzła. Oznacza to, data($P/PD:Size) eq "small" że daje ten sam wynik.

Jest to wynik:

\<PD:Picture   
  xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
  \<PD:Angle>front\</PD:Angle>  
  \<PD:Size>small\</PD:Size>  
  \<PD:ProductPhotoID>31\</PD:ProductPhotoID>  
\</PD:Picture>  

Należy pamiętać, że reguły podwyższania poziomu typów dla porównań wartości są takie same jak w przypadku porównań ogólnych. Ponadto program SQL Server używa tych samych reguł rzutu dla nietypowych wartości podczas porównań wartości, które są używane podczas porównań ogólnych. Z kolei reguły w specyfikacji XQuery zawsze rzutować nietypową wartość na xs:string podczas porównań wartości.

Operator porównania węzłów

Operator porównania węzłów ma zastosowanie tylko do typów węzłów. Zwracany wynik wskazuje, czy dwa węzły przekazywane jako operandy reprezentują ten sam węzeł w dokumencie źródłowym. Ten operator zwraca wartość True, jeśli dwa operandy są tym samym węzłem. W przeciwnym razie zwraca wartość False.

Poniższe zapytanie sprawdza, czy lokalizacja centrum pracy 10 jest pierwszą w procesie produkcji określonego modelu produktu.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' AS AWMI)  
  
SELECT ProductModelID, Instructions.query('         
    if (  (//AWMI:root/AWMI:Location[@LocationID=10])[1]         
          is          
          (//AWMI:root/AWMI:Location[1])[1] )          
    then         
          <Result>equal</Result>         
    else         
          <Result>Not-equal</Result>         
         ') as Result         
FROM Production.ProductModel         
WHERE ProductModelID=7           

Jest to wynik:

ProductModelID       Result          
-------------- --------------------------  
7              <Result>equal</Result>      

Operatory porównania kolejności węzłów

Operatory porównania kolejności węzłów porównują pary węzłów na podstawie ich pozycji w dokumencie.

Są to porównania, które są wykonywane w oparciu o kolejność dokumentów:

  • << : czy operand 1 poprzedza operand 2 w kolejności dokumentu.

  • >> : Czy operand 1 następuje po operand 2 w kolejności dokumentu.

Poniższe zapytanie zwraca wartość True, jeśli opis wykazu produktów zawiera <element Gwarancja> wyświetlany przed elementem <Konserwacji> w kolejności dokumentu dla określonego produktu.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)  
  
SELECT CatalogDescription.value('  
     (/PD:ProductDescription/PD:Features/WM:Warranty)[1] <<   
           (/PD:ProductDescription/PD:Features/WM:Maintenance)[1]', 'nvarchar(10)') as Result  
FROM  Production.ProductModel  
where ProductModelID=19  

Zwróć uwagę na następujące elementy z poprzedniego zapytania:

  • Metoda value() typu danych XML jest używana w zapytaniu.

  • Wynik logiczny zapytania jest konwertowany na nvarchar(10) i zwracany.

  • Zapytanie zwraca wartość True.

Zobacz też

system typów (XQuery)
wyrażenia XQuery