数量詞

EQLには、セットに対してブール式を使用するための存在数量詞および汎用数量詞が用意されています。

両方の型の式のいずれも、SELECT句、WHERE句、HAVING句、ORDER BY句、結合条件など、ブール式を受け入れる任意のコンテキストで出現可能です。

存在数量詞

存在数量詞ではSOMEキーワードを使用します。存在数量詞では、使用されている比較演算子に関して、セット内のいずれかの項目が一致している場合、TRUE値が返されます。

存在数量詞の構文は次のとおりです。
SOME id IN set SATISFIES (booleanExpr)
ここで、
  • idは、比較される項目の任意の識別子です。識別子では、NCName書式を使用する必要があります。
  • setはセット・データ型の1つのセットです。
  • booleanExprは、ブール(または、NULL)を生成する任意の式です。

この式は、booleanExpr内の識別子idをバインドします。このバインディングにより、条件内で同じ名前を持つ他の属性に影効果が付けられます。影効果が付けられるのは、文修飾子を持たない識別子/属性に対する参照のみです。

存在数量詞式を評価するために、EQLは指定したセットのすべてのメンバーの条件式を評価します。そして、EQLはこれらの条件値に基づいて、次のように数量詞の結果を計算します。
  1. setが空の場合、数量詞はFALSEです。
  2. booleanExprsetの最低1つの要素に対してtrueである場合、数量詞はTRUEです。
  3. booleanExprsetのすべてのid要素に対してfalseである場合、数量詞はFALSEです。
  4. そのいずれでもない場合(booleanExprの値がfalseまたはNULLで、最低1つはNULLである)、数量詞はNULLです。
この評価の結果を次にいくつか示します。
  • SOME x IN { } SATISFIES (x > 0)はFALSEです。
  • SOME x IN { -3, -2, 1 } SATISFIES (x > 0)はTRUEです。x = 1の条件式がtrueであるためです。
  • SOME x IN { 5, 7, 10 } SATISFIES (x > 0)はTRUEです。x = 5の条件がtrueであるためです。
  • SOME x IN { 'foo', '3', '4' } SATISFIES (TO_INTEGER(x) > 0)はTRUEです。x = '3'の条件がtrueであるためです。
  • SOME x IN { 'foo', '-1', '-2' } SATISFIES (TO_INTEGER(x) > 0)はNULLです。x = '-1'およびx = '-2'の条件はfalseですが、x = 'foo'の条件がNULLであるためです。
この存在数量詞の例では、Bodyは複数割当ての文字列属性です(いくつかのレコードに対する割当てのいずれかが'Robust'である)。
RETURN results AS
SELECT 
   WineID AS idRec,
   WineType AS wines,
   Body AS bodyAttr
FROM WineState
WHERE SOME x IN Body SATISFIES (x = 'Robust')
ORDER BY idRec
この文の結果は次のようになります。
bodyAttr          idRec   wines
---------------------------------------------
| { Robust, Tannins } |  4 | Red            |
| { Robust }          |  6 | Red            |
| { Oak, Robust       |  8 | Red            |
| { Robust, Tannins } | 11 | Zinfandel      |
| { Fresh, Robust }   | 19 | White          |
| { Firm, Robust }    | 22 | Blanc de Noirs |
| { Robust }          | 23 | Brut           |
| { Robust }          | 24 | Brut           |
| { Firm, Robust }    | 25 | White          |
---------------------------------------------

割当てがBody='Robust'である9つのレコードのみが返されます。

汎用数量詞

汎用数量詞ではEVERYキーワードを使用します。汎用数量詞では、使用されている比較演算子に関して、セット内のすべての項目が一致している場合、TRUE値が返されます。

汎用数量詞の構文は次のとおりです。
EVERY id IN set SATISFIES (booleanExpr)
ここで、idsetおよびbooleanExprは、存在数量詞の場合と同じ意味を表します。

この式は、booleanExpr内の識別子idをバインドします。このバインディングにより、条件内で同じ名前を持つ他の属性に影効果が付けられます。影効果が付けられるのは、文修飾子を持たない識別子/属性に対する参照のみです。

存在数量詞式の場合と同様に汎用数量詞式の場合も、EQLは指定したセットのすべてのメンバーの条件式を評価します。そして、EQLはこれらの条件値に基づいて、次のように数量詞の結果を計算します。
  1. setが空の場合、数量詞はTRUEです。
  2. booleanExprsetの最低1つの要素に対してfalseである場合、数量詞はFALSEです。
  3. booleanExprsetのすべての要素に対してtrueである場合、数量詞はTRUEです。
  4. そのいずれでもない場合(booleanExprの値がtrueまたはNULLで、最低1つはNULLである)、数量詞はNULLです。
この評価の結果を次にいくつか示します。
  • EVERY x IN { } SATISFIES (x > 0)はTRUEです。
  • EVERY x IN { -3, -2, 1 } SATISFIES (x > 0)はFALSEです。x = -3の条件がfalseであるためです。
  • EVERY x IN { 5, 7, 10 } SATISFIES (x > 0)はTRUEです。セット内のすべての値の条件がtrueであるためです。
  • EVERY x IN { 'foo', '3', '4' } SATISFIES (TO_INTEGER(x) > 0)はNULLです。x = '3'およびx = '4'の条件はtrueですが、x = 'foo'の条件がNULLであるためです。
  • EVERY x IN { 'foo', '-1', '-2' } SATISFIES (TO_INTEGER(x) > 0)はFALSEです。x = '-1'の条件がfalseであるためです。
次の汎用数量詞の例は、前述の存在数量詞の例と非常によく似ています。
RETURN results AS
SELECT 
   WineID AS idRec,
   WineType AS wines,
   Body AS bodyAttr
FROM WineState
WHERE (EVERY x IN Body SATISFIES (x = 'Robust')) AND (WineID IS NOT NULL)
ORDER BY idRec
この文の結果は次のようになります。
bodyAttr     idRec wines
--------------------------------
|            |  1 | Chardonnay |
|            |  2 | Chardonnay |
| { Robust } |  6 | Red        |
|            | 17 | Merlot     |
|            | 20 | White      |
|            | 21 | White      |
| { Robust } | 23 | Brut       |
| { Robust } | 24 | Brut       |
--------------------------------

返されるレコードは割当てがBody='Robust'の1つのみであるレコード(レコード6、23および24)、およびBodyが割り当てられていないレコード(レコード1、2、17、20および21)だけです。

この問合せでは、WHERE句内の"WineID IS NOT NULL"式の使用方法について注意してください。こうすることにより、システム内で汎用式が通常TRUEと評価される他のレコードは返さずに、空のセットを返します。