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.