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