順序比較演算子
構文
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-43 順序比較演算子
id 3のユーザーと接続しているユーザーのid、lastName、およびaddressを選択します。connectionsの後に[]を使用することに注意してください。これは配列フィルタ・ステップ(配列フィルタ・ステップ式を参照)で、connections配列のすべての要素を順序として返します(配列のネストは解除されています)。
SELECT id, lastName, address FROM users
WHERE connections[] =any 3;
例6-44 順序比較演算子
100より大きいidを持つユーザーに接続するユーザーのidとlastNameを選択します。
SELECT id, lastName FROM users
WHERE connections[] >any 100;
例6-45 順序比較演算子
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-46 順序比較演算子
市外局番650の電話番号を持つすべてのユーザーの姓と名を選択します。この問合せではphonesの後に[]を使用することもできますが、必ずしもそうする必要はありません。これは、次の.areaステップによって暗黙的にphones配列(実際に配列の場合)がネスト解除されるためです。
SELECT firstName, lastName FROM users u
WHERE u.address.phones.area =any 650;