Udostępnij za pośrednictwem


Porównanie wyrażeń (XQuery)

XQuery zapewnia następujące typy operatorów porównania:

  • Operatory porównania ogólne

  • Operatory porównania wartości

  • Operatory porównania węzła

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

Operatory porównania ogólne

Operatory porównania ogólne można porównywać wartości niepodzielny, sekwencji lub kombinacji dwóch.

Ogólne operatorzy są zdefiniowane w tabela poniżej.

Operator

Opis

=

Equal

!=

Nierówne

<

Mniejsze niż

>

Większe niż

<=

Mniejsze lub równe

>=

Większe lub równe

Dwie sekwencje są porównanie przy użyciu operatorów porównania ogólne, gdy istnieje wartość drugiego sekwencji, który porównuje wartość PRAWDA, aby wartość w pierwszej kolejności, wynik ogólny jest True.W przeciwnym razie ma wartość FAŁSZ.Na przykład (1, 2, 3) = (3, 4) jest True, ponieważ wartość 3 pojawia się w obu sekwencji.

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

Porównanie oczekuje, że wartości są porównywalne typów.W szczególności one statycznie są sprawdzane.Numeryczne porównań może wystąpić promocji typu numerycznego.Na przykład jeśli 1e1 podwójna wartość porównywana jest wartość dziesiętna 10, Podwójna zostanie zmieniona wartość dziesiętną.Należy zauważyć, że to utworzenie niedokładny wyniki, ponieważ podwójny porównania nie może być dokładne.

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

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

I odwrotnie jeśli wartość bez porównywana jest ciągiem lub inną wartość bez typu, będzie można rzutować na xs:ciąg.W następującej kwerendzie ciąg 6 jest porównywana do ciągu "17".Następująca kwerenda zwraca wartość FAŁSZ, z powodu ciąg porównania.

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

Następująca kwerenda zwraca mały rozmiar obrazów modelu produktu z katalogu produktów w AdventureWorks2008R2 przykładowej bazy danych.Kwerenda porównuje sekwencji niepodzielny wartości zwracane przez PD:ProductDescription/PD:Picture/PD:Size z sekwencji singleton, "małe".Jeśli wynikiem porównania jest PRAWDA, funkcja zwraca <obraz> elementu.

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;       

Następująca kwerenda porównuje sekwencji numerów telefonów w <numer> elementy ciąg literału "112-111-1111".Kwerenda porównuje sekwencja elementów numeru telefonu kolumna AdditionalContactInfo do określenia, czy numer telefonu specyficzne dla określonego nabywcy w dokumencie.

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.Person       
WHERE BusinessEntityID = 291;       

Kwerenda zwraca wartość True.Oznacza to, że liczba istnieje w dokumencie.Następująca kwerenda jest nieco zmodyfikowana wersja poprzedniej kwerendy.W tej kwerendzie sekwencji z dwóch wartości numeru telefonu są porównywane wartości numeru telefonu pobrane z dokumentu.Jeśli wynikiem porównania jest prawdą, <numer> element jest zwracany.

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.Person       
WHERE BusinessEntityID = 293;
       

Jest to wynikiem:

<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 niepodzielny.Należy zauważyć, że można używać operatorów porównania ogólne, zamiast operatory porównania wartości kwerend.

Operatory porównania wartości są zdefiniowane w tabela poniżej.

Operator

Opis

EQ

Equal

ne

Nierówne

lt

Mniejsze niż

gt

Większe niż

le

Mniejsze lub równe

GE

Większe lub równe

Jeśli dwie wartości porównać takie same, zgodnie z wybranym operator, wyrażenie zwróci wartość True.W przeciwnym razie zwróci False.Jeśli wartość pusta sekwencji albo wynikiem wyrażenie jest False.

Podmioty te działają w singleton tylko niepodzielny wartości.Oznacza to, że nie można określić sekwencję jako jeden z argumentów.

Na przykład następujące kwerendy pobiera <obraz> elementów modelu produktu, w którym rozmiar obrazu jest "małym:

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       

Poniższe z poprzedniej kwerendy:

  • declare namespace Określa prefiks obszaru nazw, który jest następnie użyty w kwerendzie.

  • <Rozmiar> wartość elementu jest porównywana z określonej wartości niepodzielny "małe".

  • Należy zauważyć, że ponieważ Operatorzy wartość działa tylko na wartości niepodzielny data() funkcja niejawnie służy do pobierania wartości węzła.Oznacza to, że data($P/PD:Size) eq "small" daje ten sam wynik.

Jest to wynikiem:

<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>

Uwaga zasady promocji typ porównania wartości są takie same jak dla porównania ogólne.Ponadto SQL Server korzysta z tej samej zasady odlewania bez wartości podczas porównania wartości używa podczas porównania ogólne.Natomiast reguł w specyfikacji XQuery zawsze rzutować wartości bez xs:ciąg podczas porównania wartości.

Operator porównania węzła

Operator porównania węzeł is, dotyczy tylko typów węzłów.Zwraca wynik wskazuje, czy dwa węzły przekazany jako argumenty stanowią węzeł w źródło dokument.Ten operator zwraca wartość True, jeśli dwa operandy są tym samym węźle.W przeciwnym razie zwraca wartość False.

Następująca kwerenda sprawdza, czy miejsce pracy Centrum 10 jest pierwszy w procesie wytwarzania 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 wynikiem:

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

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

Węzeł kolejność operatorów porównania pary węzłów, w zależności od ich pozycji w dokumencie.

Są to porównania, które są dokonywane na podstawie dokumentu zamówienia:

  • <<: Jest operandem 1 przed operand 2 w kolejności dokumentu.

  • >>: Jest operand 1 wykonaj operand 2 w kolejności dokumentu.

Następująca kwerenda zwraca wartość PRAWDA, jeśli opis produktu wykazu <gwarancji> elementów znajdujących się przed <Konserwacja> elementu w kolejności dokumentu dla danego 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

Poniższe z poprzedniej kwerendy:

  • The value() method of the xmldata type is used in the query.

  • wartość logiczna Wynik kwerendy jest konwertowany na nvarchar(10) i zwrócone.

  • Kwerenda zwraca wartość True.

Zobacz także

Koncepcje