Expressões de comparação (XQuery)
Aplica-se a:SQL Server
XQuery fornece os seguintes tipos de operadores de comparação:
Operadores gerais de comparação
Operadores de comparação de valor
Operadores de comparação de nós
Operadores de comparação de ordem de nó
Operadores de comparação geral
Operadores de comparação gerais podem ser usados para comparar valores atômicos, sequências ou qualquer combinação dos dois.
Os operadores gerais são definidos na tabela a seguir.
Operador | Descrição |
---|---|
= | Igual |
!= | Não é igual |
< | Menos de |
> | Maior que |
<= | Inferior ou igual a |
>= | Maior ou igual a |
Quando você está comparando duas sequências usando operadores de comparação gerais e existe um valor na segunda sequência que compara True com um valor na primeira sequência, o resultado geral é True. Caso contrário, é False. Por exemplo, (1, 2, 3) = (3, 4) é True, porque o valor 3 aparece em ambas as sequências.
declare @x xml
set @x=''
select @x.query('(1,2,3) = (3,4)')
A comparação espera que os valores sejam de tipos comparáveis. Especificamente, eles são verificados estaticamente. Para comparações numéricas, a promoção de tipo numérico pode ocorrer. Por exemplo, se um valor decimal de 10 for comparado a um valor duplo 1e1, o valor decimal será alterado para duplo. Observe que isso pode criar resultados inexatos, porque comparações duplas não podem ser exatas.
Se um dos valores não for tipado, ele será convertido para o tipo do outro valor. No exemplo a seguir, o valor 7 é tratado como um inteiro. Antes de ser comparado, o valor não tipado de /a[1] é convertido em um inteiro. A comparação de inteiros retorna True.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < 7')
Por outro lado, se o valor não tipado for comparado a uma cadeia de caracteres ou outro valor não tipado, ele será convertido em xs:string. Na consulta a seguir, a string 6 é comparada à string "17". A consulta a seguir retorna False, devido à comparação de cadeia de caracteres.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < "17"')
A consulta a seguir retorna imagens de tamanho pequeno de um modelo de produto do catálogo de produtos fornecido no banco de dados de exemplo AdventureWorks. A consulta compara uma sequência de valores atômicos retornados por PD:ProductDescription/PD:Picture/PD:Size
com uma sequência de singleton, "pequena". Se a comparação for True, ela retornará o elemento> Picture <.
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
A consulta a seguir compara uma sequência de números de telefone em <elementos de número> com a cadeia de caracteres literal "112-111-1111". A consulta compara a sequência de elementos de número de telefone na coluna AdditionalContactInfo para determinar se existe um número de telefone específico para um cliente específico no documento.
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
A consulta retorna True. Isso indica que o número existe no documento. A consulta a seguir é uma versão ligeiramente modificada da consulta anterior. Nesta consulta, os valores de número de telefone recuperados do documento são comparados com uma sequência de dois valores de número de telefone. Se a comparação for True, o número <> elemento será retornado.
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
Este é o resultado:
\<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>
Operadores de comparação de valor
Os operadores de comparação de valores são usados para comparar valores atômicos. Observe que você pode usar operadores de comparação gerais em vez de operadores de comparação de valor em suas consultas.
Os operadores de comparação de valores são definidos na tabela a seguir.
Operador | Descrição |
---|---|
QE | Igual |
NE | Não é igual |
lt | Menos de |
GT | Maior que |
le | Inferior ou igual a |
GE | Maior ou igual a |
Se os dois valores compararem o mesmo de acordo com o operador escolhido, a expressão retornará True. Caso contrário, ele retornará False. Se qualquer um dos valores for uma sequência vazia, o resultado da expressão será False.
Estes operadores trabalham apenas com valores atómicos singleton. Ou seja, você não pode especificar uma sequência como um dos operandos.
Por exemplo, a consulta a seguir recupera <elementos Picture> para um modelo de produto em que o tamanho da imagem é "pequeno:
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
Observe o seguinte da consulta anterior:
declare namespace
define o prefixo de namespace que é usado subsequentemente na consulta.O valor <Size> elemento é comparado com o valor atômico especificado, "pequeno".
Observe que, como os operadores de valor trabalham apenas em valores atômicos, a função data() é implicitamente usada para recuperar o valor do nó. Ou seja,
data($P/PD:Size) eq "small"
produz o mesmo resultado.
Este é o resultado:
\<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>
Observe que as regras de promoção de tipo para comparações de valor são as mesmas que para comparações gerais. Além disso, o SQL Server usa as mesmas regras de transmissão para valores não tipados durante comparações de valor que usa durante comparações gerais. Por outro lado, as regras na especificação XQuery sempre convertem o valor não tipado para xs:string durante comparações de valor.
Operador de comparação de nós
O operador de comparação de nós, é, aplica-se apenas aos tipos de nós. O resultado que ele retorna indica se dois nós passados como operandos representam o mesmo nó no documento de origem. Este operador retornará True se os dois operandos forem o mesmo nó. Caso contrário, ele retorna False.
A consulta a seguir verifica se o local do centro de trabalho 10 é o primeiro no processo de fabricação de um modelo de produto específico.
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
Este é o resultado:
ProductModelID Result
-------------- --------------------------
7 <Result>equal</Result>
Operadores de comparação de ordem de nós
Os operadores de comparação de ordem de nós comparam pares de nós, com base em suas posições em um documento.
Estas são as comparações que são feitas, com base na ordem dos documentos:
<<
: operando 1 precede operando 2 na ordem do documento.>>
: operando 1 segue operando 2 na ordem do documento.
A consulta a seguir retornará True se a descrição do catálogo de produtos tiver o elemento <Warranty> aparecendo antes do elemento <Maintenance> na ordem do documento para um determinado produto.
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
Observe o seguinte da consulta anterior:
O método value() do tipo de dados xmlé usado na consulta.
O resultado booleano da consulta é convertido em nvarchar(10) e retornado.
A consulta retorna True.