ROW および LIST の比較

ROW と LIST を、別の ROW と LIST に対して比較できます。

例 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 ...
以下の XML 入力メッセージ本体の場合、 上の 2 つのステートメント中の両方の IF 式が TRUE に評価されます。
<Data>
      <Name>Raf</Name>
      <Age>25</Age>
</Data>
ROW 同士の比較では、各エレメントの名前と値が比較対象となり、 LIST 同士の比較では、各エレメントの名前だけが比較対象となります。 どちらの場合も、2 つのオペランドが等しくなるためには、 比較される LIST または ROW オペランドの基数および順序が等しくなければなりません。 つまり、以下はすべて FALSE になります。 なぜなら、比較されるオペランドの順序または基数のいずれかが一致しないからです。
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}

例 2

次の ESQL をご覧ください。
IF InputBody.Places =
   ROW('Ken' AS first, 'Bob' AS second, 'Kate' AS third) THEN ...
以下の XML 入力メッセージ本体の場合、上の IF 式は TRUE に評価されます。
<Places>
      <first>Ken</first>
      <second>Bob</second>
      <third>Kate</third>
</Places>

比較演算子に対するオペランドの 1 つとして明示的に構成された ROW があると、 他のオペランドも ROW として扱われるようになります。

このことを、次の比較と対比してみましょう。
IF InputBody.Lottery.FirstDraw = InputBody.Lottery.SecondDraw THEN ...
これは、 ROW として構成された FirstDraw と SecondDraw の子フィールドのそれぞれの名前と値ではなく、 FirstDraw と SecondDraw のフィールドの値を比較します。 したがって、次のような XML 入力メッセージ本体の場合:
<Lottery>
      <FirstDraw>wednesday
            <ball1>32</ball1>
            <ball2>12</ball2>
      </FirstDraw>
      <SecondDraw>saturday
            <ball1>32</ball1>
            <ball2>12</ball2>
      </SecondDraw>
</Lottery>
この場合、上の IF 式は TRUE に評価されません。 なぜなら、比較されるのは wednesday と saturday の値であり、 ball フィールドの名前および値ではないからです。

例 3

次の ESQL をご覧ください。
IF InputBody.Cities.City[] = LIST{'Athens','Sparta','Thebes'} THEN ...
以下の XML 入力メッセージ本体の場合、IF 式は TRUE に評価されます。
<Cities>
	<City>Athens</City>
	<City>Sparta</City>
	<City>Thebes</City>
</Cities>
この方法で、2 つのメッセージ・フィールド配列を互いに比較することができます。 たとえば、次のようになります。
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 ...
以下の XML 入力メッセージ本体の場合、上の最初および 3 番目のステートメントの IF 式は、 TRUE に評価されます。
<Cities>
      <Mediaeval>1350
            <City>London</City>
            <City>Paris</City>
      </Mediaeval>
      <Modern>1990
            <City>London</City>
            <City>Paris</City>
      </Modern>
</Cities>
しかしながら、2 番目のステートメントの IF 式は FALSE に評価されます。 なぜなら、*[] は (XML.Element) だけでなく Mediaeval と Modern のすべての子を比較するからです。 つまり、この場合、Mediaeval と Modern の名前を持たない子を形成する 1350 と 1990 の値、 および City タグの値が比較されます。
上の 3 番目のステートメントの IF 式は、 以下の XML 入力メッセージ本体でも TRUE に評価されます。
<Cities>
      <Mediaeval>1350
            <Location>London</Location>
            <Location>Paris</Location>
      </Mediaeval>
      <Modern>1990
            <City>London</City>
            <City>Paris</City>
      </Modern>
</Cities>
LIST は、一連の名前なしの値で構成されます。 比較されるのは、Mediaeval と Modern の子フィールドの値であり、その名前ではありません。

関連概念
ESQL

関連タスク
ESQL の開発

関連資料
複合 ESQL 関数
ROW コンストラクター関数
LIST コンストラクター関数
ROW と LIST の結合