Porównanie wyrażenia (XQuery)

XQuery dostępne są 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ści węzłów

Operatorzy porównanie ogólne

Do porównywania wartości niepodzielny, sekwencji lub dowolnej kombinacji tych można używać operatorów porównania ogólne.

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

Operator

Description

=

Equal

!=

Nie ma wartości

<

Mniejsze niż

>

Większe niż

<=

Mniejsze lub równe

>=

Większe lub równe

Gdy dwie sekwencje są porównywanie przy użyciu operatorów porównania ogólne, a wartość istnieje w drugiej kolejności, porównuje wartość PRAWDA, aby wartość w pierwszej kolejności, wynik ogólny ma wartość true.W przeciwnym razie ma wartość FAŁSZ.Na przykład (1, 2, 3) = (3, 4) jest TRUE, ponieważ wartość 3 znajduje się w obu sekwencji.

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

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

Jeśli jest jedną z wartości bez typu, jest rzutować na typ inną wartość.W poniższym przykładzie wartość 7 jest traktowana jako liczbę całkowitą z zakresu.Przed są porównywane wartości bez typu /a [1] jest konwertowana na liczbę całkowitą.Porównanie liczby całkowitej zwraca wartość PRAWDA.

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

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

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 przykładowej bazie danych AdventureWorks.Sekwencja niepodzielny wartości zwracane przez porównanie kwerendy PD:ProductDescription/PD:Picture/PD:Sizez pojedynczych sekwencji, "małej". Jeśli wynikiem porównania jest PRAWDA, zwracana <Obraz> element.

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 do ciąg literału "112-111-1111". Kwerendy porównuje kolejność elementów numerów telefonów kolumna AdditionalContactInfo w celu 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.Contact       
WHERE ContactID=1       

Zwraca wartość PRAWDA.Oznacza to, czy dany numer występuje w dokumencie.Następująca kwerenda jest nieco zmodyfikowanej wersja poprzedniej kwerendy.W tej kwerendzie wartości numeru telefonu pobrane z dokumentu są porównywane z sekwencji z dwóch wartości numeru telefonu.Jeśli wynikiem porównania jest PRAWDA, <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.Contact       
WHERE ContactID=1
       

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

Operatorzy porównanie wartości

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

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

Operator

Description

EQ

Equal

ne

Nie ma wartości

lt

Mniejsze niż

gt

Większe niż

le

Mniejsze lub równe

GE

Większe lub równe

Jeśli te dwie wartości porównać takie same, zgodnie z wybranym operator, wyrażenie zwróci wartość PRAWDA.W przeciwnym razie to zostanie zwrócona wartość false.Jeśli każda wartość jest sekwencją puste, wynikiem wyrażenie jest wartość false.

Te operatory działają w pojedynczych tylko niepodzielny wartości.Oznacza to nie można określić sekwencję jako argumenty.

Na przykład poniższa kwerenda pobiera <Obraz>elementy do 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       

Pierwszy przycisk jest przyciskiem domyślnym.

  • declare namespace Określa prefiks obszaru nazw, które są następnie używane w kwerendzie.

  • The <Size> element value is compared with the specified niepodzielny value, "small".

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

To jest 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 zauważyć, że zasady promocji typ porównania wartości są takie same, jak w przypadku porównania ogólne.Ponadto SQL Server Podczas porównywania wartości używa tych samych zasad rzutowania do wartości bez typu jak wykorzystywane podczas porównań ogólne. Natomiast zasady w specyfikacji XQuery zawsze rzutować bez typu wartość xs:ciąg podczas porównania wartości.

Operator porównanie węzła

Operator porównania węzła is, dotyczy tylko typów węzłów. Zwraca wynik wskazuje, czy dwa węzły przekazany jako argumenty stanowią tym samym węźle, w dokumencie źródłowym.Ten operator zwraca wartość PRAWDA, jeśli dwa argumenty są tym samym węźle.W przeciwnym razie zwraca wartość false.

Następujące kwerendy sprawdza, czy lokalizacja środka pracy 10 jest pierwszy 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         

To jest wynik:

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

Operatorzy porównanie kolejność węzłów

Operatory porównania kolejności węzłów do porównywania par węzłów, w zależności od ich pozycji w dokumencie.

Są to porównania, które są wykonywane na podstawie numeru dokumentu:

  • << : Czy Operand 1 precede Argument 2 w kolejności dokumentu.

  • >> : Czy Operand 1 follow Argument 2 w kolejności dokumentu.

Następująca kwerenda zwraca wartość PRAWDA, jeśli ma opis wykazu produktów <Gwarancja> element występujące przed <Konserwacja> element 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

Pierwszy przycisk jest przyciskiem domyślnym.

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

  • Logiczna wynikiem kwerendy jest konwertowany na nvarchar(10) i zwrócone.

  • Zwraca wartość PRAWDA.