論理演算子: AND、ORおよびNOT

構文

expression ::= or_expression

or_expression ::= and_expression | (or_expression OR and_expression)

and_expression ::= not_expression | (and_expression AND not_expression)

not_expression ::= [NOT] is_null_expression

セマンティクス

バイナリ演算子ANDおよびORと単項演算子NOTには、通常のセマンティクスがあります。これらのオペランドは条件式であり、それにはBOOLEAN型が含まれている必要があります。オペランドからの空の結果は、false値として処理されます。オペランドがNULLを返す場合は、次のようになります。
  • AND演算子は、他のオペランドがfalseを返す場合はfalseを、それ以外の場合はNULLを返します。
  • OR演算子は、他のオペランドがtrueを返す場合はtrueを、それ以外の場合はNULLを返します。
  • NOT演算子はNULLを返します。

例6-56 20才から40才までの年齢グループにいないか収入が90000より多いユーザーについてID、名、姓および年齢をフェッチする

SELECT id, firstName, lastName FROM users WHERE NOT age BETWEEN 20 AND 40 OR income > 90000

ユーザー・データを保持するアプリケーションについて考えてみます。ageフィールドにはユーザーの年齢が保持され、incomeフィールドにはユーザーの収入が含まれています。前述の問合せでは、演算子の組合せを使用して、20才から40才までの年齢グループにいないか収入が90000より多いユーザーのリストを取得しています。BETWEEN演算子では、入力式が境界値の範囲内にあるかどうかが検証されます。年齢が20才未満または40才を超えているユーザーが必要であるため、論理演算子NOTとともにageフィールドにBETWEEN演算子を使用して、指定範囲外のユーザーをフェッチしています。収入が90000より多いユーザーのリストをフェッチするには、値比較演算子'>'を使用してユーザーのincomeフィールドを比較します。OR演算子を使用して、これらの条件のどちらかを満たすユーザーのリストをフェッチしています。

出力:
{"id":30,"firstName":"Adam","lastName":"Smith","age":45}

例6-57 行き先がFRA空港で受託手荷物を1つのみ運んでいる男性乗客のリストを航空会社手荷物追跡アプリケーションからフェッチする

SELECT
fullname,
s.bagInfo[].flightLegs[].fltRouteDest,
ticketNo
FROM BaggageInfo s
WHERE gender = 'M'
AND s.bagInfo[].flightLegs[].fltRouteDest=any "FRA"
AND (size(s.bagInfo) = 1)

航空会社手荷物追跡アプリケーションでは、行き先が特定の到着地である男性乗客の詳細をフェッチできます。BaggageInfo表内のfltRouteDestフィールドには、移動区間ごとの到着地空港コードが含まれています。fltRouteDestフィールドには終着空港または経由空港を保持できます。行き先がFRAで受託手荷物を1つのみ運んでいる男性乗客のリストを取得するために、値比較操作を実行し、AND演算子を使用して、すべての基準に一致するように結果を絞り込んでいます。genderフィールドを比較することで、すべての男性乗客のリストをフェッチしています。空港コード'FRA'を指定してfltRouteDestフィールドに文字列比較操作を実行することで、行き先がFRA空港である乗客のリストを取得しています。bagInfo配列のサイズを比較して、受託手荷物が1つのみである乗客を選択しています。AND演算子を使用して、前述のすべての条件を満たす乗客のリストをフェッチしています。

ここで、s.bagInfo.fltRouteDestは順序です。値比較演算子は、複数項目の順序には効果がありません。fltRouteDestフィールドを比較するために、値比較演算子'='に加えて順序比較演算子anyが使用されています。

ノート:

問合せに複数の論理演算子がある場合は、カッコを適切に使用してください。評価の順序において、最初に評価されるのはカッコです。
出力:
{"fullname":"Henry Jenkins","fltRouteDest":["ORD","FRA"],"ticketNo":176234463813}
{"fullname":"Raymond Griffin","fltRouteDest":["FRA","HKG"],"ticketNo":1762399766476}