順序比較演算子

構文

any_comparison_operator ::= "=any" | "!=any" | ">any" | ">=any" | "<any" | "<=any"

セマンティクス

2つの順序間の比較は、一連の異なる演算子(=any、!=any、>any、>=any、<any、<=any)を使用して実行されます。これらの演算子には実存的なセマンティクスがあります。2つの入力順序S1およびS2の演算子の結果がtrueであるのは、項目i1およびi2のペアがある場合のみです。i1はS1に属し、i2はS2に属し、対応する値の比較演算子によってi1とi2の比較結果がtrueになります。それ以外の場合、入力順序のいずれかにNULLが含まれる場合、結果はNULLになります。それ以外の場合、結果はfalseになります。

例6-67 航空手荷物追跡データから、フライト時間が2019-02-01T16:00:00Zより大きい乗客名をフェッチします

SELECT fullname, $flights.flightDate
FROM BaggageInfo bag, bag.bagInfo[0].flightLegs AS $flights
WHERE $flights.flightDate >any "2019-02-01T16:00:00Z"
説明: 出発時間が指定された値より大きいすべての乗客のフルネームとフライト日をフェッチします。ここでは、">"演算子の左側のオペランド(bag.bagInfo[0].flightLegs.flightDate)は値の順序です。順序演算子のかわりに通常の比較演算子を使用しようとすると、次に示すエラーが表示されます:
Error handling command SELECT fullname, $flights.flightDate
FROM BaggageInfo bag, bag.bagInfo[0].flightLegs AS $flights
WHERE $flights.flightDate > "2019-02-01T16:00:00Z": Error: at (3, 6) The left operand of comparison operator > is a sequence with more than one items. Comparison operators cannot operate on sequences of more than one items.

かわりに、ここでは、値比較演算子">"とともに順序演算子anyを使用する必要があります。

bagInfo JSON配列の最初の要素のみを使用して、複数の手荷物を持っている乗客の結果が重複しないようにします。トランジット便の出発時間も出力に含まれます。ここでは、タイムスタンプ・データ型にキャストせずに、文字列の自然なソート順序により、文字列書式がISO-8601書式である日付を比較できます。

出力:
{"fullname":"Michelle Payne","flightDate":["2019-02-02T12:00:00Z","2019-02-02T13:10:00Z","2019-02-02T12:10:00Z"]}
{"fullname":"Zulema Martindale","flightDate":["2019-02-25T10:00:00Z","2019-02-25T10:23:00Z"]}
{"fullname":"Zina Christenson","flightDate":["2019-02-04T00:00:00Z","2019-02-04T00:12:00Z"]}
{"fullname":"Elane Lemons","flightDate":["2019-03-15T08:00:00Z","2019-03-15T08:13:00Z","2019-03-15T08:13:00Z"]}
{"fullname":"Omar Harvey","flightDate":["2019-03-01T12:00:00Z","2019-03-01T12:20:00Z"]}
{"fullname":"Henry Jenkins","flightDate":["2019-03-02T05:00:00Z","2019-03-02T05:24:00Z"]}
{"fullname":"Rosalia Triplett","flightDate":["2019-02-11T01:00:00Z","2019-02-11T02:12:00Z"]}
{"fullname":"Kendal Biddle","flightDate":["2019-03-04T06:00:00Z","2019-03-04T07:02:00Z"]}
{"fullname":"Mary Watson","flightDate":["2019-03-13T00:00:00Z","2019-03-13T00:21:00Z"]}
{"fullname":"Gerard Greene","flightDate":["2019-03-07T04:00:00Z","2019-03-07T05:08:00Z","2019-03-07T04:08:00Z"]}
{"fullname":"Joanne Diaz","flightDate":["2019-02-16T06:00:00Z","2019-02-16T06:24:00Z"]}
{"fullname":"Adelaide Willard","flightDate":["2019-02-15T01:00:00Z","2019-02-15T01:21:00Z"]}
{"fullname":"Fallon Clements","flightDate":["2019-02-21T12:00:00Z","2019-02-21T12:19:00Z","2019-02-21T12:19:00Z"]}
{"fullname":"Teena Colley","flightDate":["2019-02-13T07:00:00Z","2019-02-13T07:17:00Z"]}
{"fullname":"Lorenzo Phil","flightDate":["2019-03-12T03:00:00Z","2019-03-12T10:11:00Z","2019-03-12T14:11:00Z"]}
{"fullname":"Lucinda Beckman","flightDate":["2019-03-12T03:00:00Z","2019-03-12T04:11:00Z","2019-03-12T03:11:00Z"]}
{"fullname":"Doris Martin","flightDate":["2019-03-22T07:00:00Z","2019-03-22T07:23:00Z","2019-03-22T07:23:00Z"]}
{"fullname":"Raymond Griffin","flightDate":["2019-02-03T04:00:00Z","2019-02-03T04:21:00Z"]}
{"fullname":"Lisbeth Wampler","flightDate":["2019-02-09T06:00:00Z","2019-02-09T20:01:00Z"]}
{"fullname":"Dierdre Amador","flightDate":"2019-03-07T07:00:00Z"}

例6-68 id 3のユーザーと接続しているユーザーのid、lastName、およびaddressを選択します。

SELECT id, lastName, address FROM users
WHERE connections[] =any 3

connectionsの後に[]を使用することに注意してください。これは配列フィルタ・ステップ(配列フィルタ・ステップ式を参照)で、connections配列のすべての要素を順序として返します(配列のネストは解除されています)。

例6-69 100より大きいidを持つユーザーに接続するユーザーのidとlastNameを選択します

SELECT id, lastName FROM users
WHERE connections[] >any 100

例6-70 idが10より大きいユーザーとidが100未満のユーザーに接続している各ユーザーのidを選択します

SELECT id FROM users u
WHERE 10 <any u.connections[] 
    AND u.connections[] <any 100

前述の問合せは、「10から100の範囲内のidを持つユーザーに接続している各ユーザーのidを選択する」問合せとは異なります。最初の問合せでは、idが10より大きい接続とidが100未満の別の接続(最初の接続と同じ場合と異なる場合があります)を検索します。2番目の問合せでは、idが10から100の接続を検索します。違いを明確にするために、2人のユーザー(たとえばidが200と500)のみのユーザー表に接続配列[ 1, 3, 110, 120 ]と[1, 50, 130]をそれぞれ設定するとします。これらの配列はどちらも最初の問合せの述語を満たすため、両方のユーザーが選択されます。一方、配列[ 1, 3, 110, 120 ]には10から100の範囲の要素が含まれていないため、2番目の問合せではユーザー200は選択されません。

2番目の問合せは、EXISTS演算子と配列フィルタリング・ステップの組合せによって記述できます。

SELECT id FROM users u
WHERE EXISTS u.connections
    [10 < $element AND $element < 100]

2 <any演算子を含む最初の問合せは、次と同じになります。

SELECT id FROM users u
WHERE EXISTS u.connections[10 < $element] 
    AND EXISTS u.connections[$element < 100]

例6-71 市外局番650の電話番号を持つすべてのユーザーの姓と名を選択する

この問合せではphonesの後に[]を使用することもできますが、必ずしもそうする必要はありません。これは、次の.areaステップによって暗黙的にphones配列(実際に配列の場合)がネスト解除されるためです。

SELECT firstName, lastName FROM users u
WHERE u.address.phones.area =any 650

JSONコレクション表:

次の例では、JSONコレクション表に順序比較演算子を適用します。ショッピング・アプリケーション用に作成されたJSONコレクション表のサンプル行について考えてみます。
{"contactPhone":"1517113582","address":{"city":"Houston","number":651,"state":"TX","street":"Tex Ave","zip":95085},"cart":null,"firstName":"Dierdre","lastName":"Amador","orders":[{"EstDelivery":"2023-11-01","item":"handbag","orderID":"201200","priceperunit":350},{"EstDelivery":"2023-11-01","item":"Lego","orderID":"201201","priceperunit":5500}]}

例6-72 ハンドバッグを購入し、配送予定が2023年10月31日より後の買物客の詳細をフェッチします

SELECT contactPhone, firstName
FROM storeAcct s 
WHERE s.orders[].item =any "handbag" AND s.orders[].EstDelivery>=any "2023-10-31"

説明: handbagを購入し、10月31日より後に配送される予定の買物客の詳細をフェッチするには、順序比較演算子anyを使用して、itemおよびEstDeliveryフィールドと必要な値を比較します。AND演算子を使用して、両方の条件に一致する行をフェッチします。

ここでは、ISO-8601形式の文字列形式の日付であり、文字列の自然なソート順が適用されるので、タイムスタンプ・データ型にキャストせずにEstDeliveryを比較できます。

出力:
{
  "contactPhone" : "1517113582",
  "firstName" : "Dierdre"
}