Comparaciones de ROW y LIST

Puede comparar filas (ROW) y listas (LIST) con otras ROW y LIST.

Ejemplos

Ejemplo 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 ...
Con el siguiente cuerpo del mensaje de entrada XML ambas expresiones IF en las dos sentencias anteriores se evalúan como TRUE:
<Data>
   <Name>Raf</Name>
   <Age>25</Age>
</Data>
En la comparación entre las ROW, se comparan tanto el nombre como el valor de cada elemento; en la comparación entre LIST, sólo se compara el valor de cada elemento. En ambos casos, la cardinalidad y el orden secuencial de los operandos LIST o ROW que se comparan debe ser igual para que ambos operandos sean iguales. En otras palabras, todos los siguientes son falsos porque no coinciden el orden secuencial o la cardinalidad de los operandos que se comparan:
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}

Ejemplo 2

Examine el ESQL siguiente:
IF InputBody.Places =
   ROW('Ken' AS first, 'Bob' AS second, 'Kate' AS third) THEN ...
Con el siguiente cuerpo del mensaje de entrada XML, la expresión IF anterior se evalúa como TRUE:
<Places>
   <first>Ken</first>
   <second>Bob</second>
   <third>Kate</third>
</Places>

La presencia de una ROW construida explícitamente como uno de los operandos con el operador de comparación da como resultado que el otro operando también se trate como una ROW.

Compare este hecho con una comparación como la siguiente:
IF InputBody.Lottery.FirstDraw = InputBody.Lottery.SecondDraw THEN ...
que compara el valor de los campos FirstDraw y SecondDraw, no los nombres ni los valores de cada uno de los campos dependientes de FirstDraw y SecondDraw construidos como una ROW. Así pues, el cuerpo de un mensaje de entrada XML como, por ejemplo:
<Lottery>
   <FirstDraw>miércoles
      <ball1>32</ball1>
      <ball2>12</ball2>
   </FirstDraw>
   <SecondDraw>sábado
      <ball1>32</ball1>
      <ball2>12</ball2>
   </SecondDraw>
</Lottery>
no daría como resultado que la expresión IF anterior se evaluase como TRUE, porque se están comparando los valores miércoles y sábado, no los nombres y valores de los campos de las bolas.

Ejemplo 3

Examine el ESQL siguiente:
IF InputBody.Cities.City[] = LIST{'Atenas','Esparta','Tebas'} THEN
...
Con el siguiente cuerpo del mensaje de entrada XML, la expresión IF se evalúa como TRUE:
<Cities>
	<City>Atenas</City>
	<City>Esparta</City>
	<City>Tebas</City>
</Cities>
De esta manera se pueden comparar dos matrices de campos de mensajes, por ejemplo:
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 ...
Con el siguiente cuerpo del mensaje de entrada XML, la expresión IF de la primera y tercera sentencia se evalúa como TRUE:
<Cities>
   <Mediaeval>1350
      <City>Londres</City>
      <City>París</City>
   </Mediaeval>
   <Modern>1990
      <City>Londres</City>
      <City>París</City>
   </Modern>
</Cities>
Sin embargo, la expresión IF de la segunda sentencia se evalúa como FALSE, porque *[] indica que tienen que compararse todos los elementos dependientes de Mediaeval y Modern, no sólo los (XML.Element). En este caso, se comparan los valores 1350 y 1990, que forman elementos dependientes sin nombre de Mediaeval y Modern, así como los valores de los códigos City.
La expresión IF de la tercera sentencia anterior se evalúa como TRUE con un cuerpo del mensaje de entrada XML como, por ejemplo:
<Cities>
   <Mediaeval>1350
      <Location>Londres</Location>
      <Location>París</Location>
   </Mediaeval>
   <Modern>1990
      <City>Londres</City>
      <City>París</City>
   </Modern>
</Cities>
Las LIST se componen de valores sin nombre. Son los valores de los campos dependientes de Mediaeval y Modern los que se comparan, no sus nombres.

Conceptos relacionados
ESQL

Tareas relacionadas
Desarrollo de ESQL

Referencia relacionada
Funciones ESQL complejas
Función de constructor ROW
Función de constructor LIST
ROW y LIST combinadas