順序比較演算子
構文
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コレクション表:
{"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"
}