順序比較演算子

構文

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 id 3のユーザーと接続しているユーザーのid、lastName、およびaddressを選択します。

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

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

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

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

例6-69 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-70 市外局番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-71 ハンドバッグを購入し、配送予定が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"
}