Comparações de ROW e LIST

ROWs e LISTs podem ser comparadas com outras ROWs e LISTs.

Exemplos

Exemplo 1

IF ROW(InputBody.Data.*[1],InputBody.Data.*[2]) =
                                  ROW('Raf' AS Name,'25' AS Age) THEN ...
IF LIST{InputBody.Data.Name, InputBody.Data.Age} = LIST{'Raf','25'} THEN ...
Com o corpo da mensagem de entrada XML a seguir, ambas as expressões IF nas duas instruções acima são avaliadas como TRUE:
<Dados>
   <Nome>Raf</Nome>
   <Idade>25</Idade>
</Dados>
Na comparação entre ROWs, o nome e o valor de cada elemento são comparados; na comparação entre LISTs apenas o valor de cada elemento é comparado. Nos dois casos, a cardinalidade e a ordem seqüencial dos operandos LIST ou ROW que estão sendo comparados devem ser iguais para que os dois operandos sejam iguais. Em outras palavras, todos os itens a seguir são false porque a ordem seqüencial ou a cardinalidade dos operandos que estão sendo comparados não é correspondente:
ROW('alpha' AS A, 'beta' AS B) =
                          ROW('alpha' AS A, 'beta' AS B, 'delta' AS D)
ROW('alpha' AS A, 'beta' AS B) =
                          ROW('beta' AS B,'alpha' AS A)
LIST{1,2,3} = LIST{1,2,3,4}
LIST{3,2,1} = LIST{1,2,3}

Exemplo 2

Considere o seguinte ESQL:
IF InputBody.Places =
      ROW('Ken' AS first, 'Bob' AS second, 'Kate' AS third) THEN ...
Com o corpo da mensagem de entrada XML a seguir, a expressão IF acima é avaliada como TRUE:
<Locais>
   <primeiro>Ken</primeiro>
   <segundo>Bob</segundo>
   <terceiro>Kate</terceiro>
</Locais>

A presença de uma ROW explicitamente construída como um dos operandos no operador de comparação resulta em outro operando também sendo tratado como uma ROW.

Isso deve ser contrastado com uma comparação, tal como:
IF InputBody.Lottery.FirstDraw = InputBody.Lottery.SecondDraw THEN ...
que compara o valor dos campos FirstDraw e SecondDraw, não os nomes e valores de cada um dos campos filhos de FirstDraw e SecondDraw construídos como uma ROW. Assim, um corpo de mensagem de entrada XML, tal como:
<Loteria>
   <FirstDraw>quarta-feira
      <ball1>32</ball1>
      <ball2>12</ball2>
   </FirstDraw>
   <SecondDraw>sábado
      <ball1>32</ball1>
      <ball2>12</ball2>
   </SecondDraw>
</Loteria>
não resultaria na expressão IF acima sendo avaliada como TRUE, porque os valores quarta-feira e sábado estão sendo comparados, não os nomes e valores dos campos ball.

Exemplo 3

Considere o seguinte ESQL:
IF InputBody.Cities.City[] =
LIST{'Athens','Sparta','Thebes'} THEN ...
Com o corpo da mensagem de entrada XML a seguir, a expressão IF é avaliada como TRUE:
<Cidades>
<Cidade>Atenas</Cidade>
<Cidade>Esparta</Cidade>
<Cidade>Tebas</Cidade>
</Cidades>
Duas matrizes de campos de mensagens podem ser comparadas desta forma, por exemplo:
IF InputBody.Cities.Mediaeval.City[] =
                                        InputBody.Cities.Modern.City[] THEN ...

IF InputBody.Cities.Mediaeval.*[] = InputBody.Cities.Modern.*[] THEN ...

IF InputBody.Cities.Mediaeval.(XML.Element)[] =
                                        InputBody.Cities.Modern.(XML.Element)[] THEN ...
Com o corpo da mensagem de entrada XML a seguir, a expressão IF da primeira e terceira instruções acima são avaliadas como TRUE:
<Cidades>
   <Medieval>1350
      <Cidade>Londres</Cidade>
      <Cidade>Paris</Cidade>
   </Medieval>
   <Moderna>1990
      <Cidade>Londres</Cidade>
      <Cidade>Paris</Cidade>
   </Moderna>
</Cidades>
No entanto, a expressão IF da segunda instrução é avaliada como FALSE, porque o *[] indica que todos os filhos de Mediaeval e Modern devem ser comparados, não apenas (XML.Element)s. Neste caso, os valores 1350 e 1990, que formam filhos sem nome de Mediaeval e Modern, também são comparados como valores das marcações City.
A expressão IF da terceira instrução acima é avaliada como TRUE com um corpo de mensagem de entrada XML, tal como:
<Cidades>
   <Medieval>1350
      <Local>Londres</Local>
      <Local>Paris</Local>
   </Medieval>
   <Moderna>1990
      <Cidade>Londres</Cidade>
      <Cidade>Paris</Cidade>
   </Moderna>
</Cidades>
LISTs são compostos de valores não denominados. São os valores dos campos filhos de Medieval e Moderno que são comparados, não seus nomes.
Conceitos relacionados
Visão Geral do ESQL
Tarefas relacionadas
Desenvolvendo ESQL
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ak05660_