IN演算子

構文

in_expression ::= in1_expression | in2_expression |
    in3_expression | in4_expression

in1_expression ::= "(" concatenate_expression 
    ("," concatenate_expression)* ")" 
    IN "(" expression ("," expression)* ")"
in2_expression ::= concatenate_expression 
    IN "(" expression ("," expression)* ")"
in3_expression ::= concatenate_expression IN path_expression
in4_expression ::= "(" concatenate_expression 
    ("," concatenate_expression)* ")" IN path_expression

セマンティクス

IN演算子は、基本的には多数のいずれかが満たされている等価条件の簡潔な代替となります。たとえば、次の問合せを見てみます

SELECT * FROM users WHERE age IN (22, 25, 43)
 
is equivalent to
 
SELECT * FROM users WHERE age = 22 OR age = 25 OR age = 43

次の問合せも見てみます。

SELECT * FROM users
    WHERE (firstName, lastName) IN
        (("John","Smith"),("Peter","Paul"),("Mary","Ann"))
 
is equivalent to
 
SELECT * FROM users
    WHERE (firstName = "John" AND lastName = "Smith") OR
        (firstName = "Peter" AND lastName = "Paul") OR
        (firstName = "Mary" AND lastName = "Ann")

構文に示されているように、IN演算子には4つの構文バリアントがあります。in1_expressionおよびin2_expressionは、標準のSQL構文に従います。in2_expressionは実際は、演算子の左側に式が1つしかない場合のin1_expressionの特殊なケースです。in1_expressionでは、Kが左側の式の数である場合、右側のそれぞれの式リストはK個の式で構成される必要があります。Nが右側の式リストの数である場合、IN条件全体が次と同じになります。

(expr1 = expr11 and expr2 = expr12 and exprK = expr1K) or
(expr1 = expr21 and expr2 = expr22 and exprK = expr2K) or
.... or
(expr1 = exprN1 and expr2 = exprN2 and exprK = exprNK)

ただし、適切な索引が存在する場合、IN演算子を使用した問合せはより簡潔であるだけでなく、より効率的に実行されます。たとえば、表ユーザーが列age、firstName、およびlastNameに索引を持つ場合は、前述のIN問合せの両方で、その索引を使用して条件を満たす行が検索されますが、同等のOR問合せは全表スキャンを介して実行されます。適用可能索引の検索の例も参照してください。

in3_expressionおよびin4_expressionバリアントにより、1つのバインド変数を介して比較的多数の検索キーを指定できます。たとえば、$keys変数が配列[ "John", "Smith", "Peter", "Paul", "Mary", "Ann"]にバインドされている場合、次の問合せは前述の2番目のIN問合せと同等になります。

DECLARE $keys ARRAY(json);
SELECT * FROM users
    WHERE (firstName, lastName) IN $keys[]

通常、in3_expressionおよびin4_expressionバリアントでは、右側の式が最初に評価されます。結果の順序の項目の数Mが、左側の式の数Kより少ない場合、IN演算子の結果はfalseになります。MがKの倍数でない場合は、順序内の最後の(M mod K)項目が破棄され、Mは残りの項目数に設定されます。IN式は次と同等になります。

(expr1 = k1 and expr2 = k2 and exprK = kK) or
(expr1 = kK+1 and expr2 = kK+2 and exprK = k2*K) or
 .... or
(expr1 = kM-K and expr2 = kM-K+1 and exprK = kM)

ただし、この場合、追加のタイプ・チェック制限が適用されます。前述の等価条件のそれぞれで、右側の項目のタイプが左側のタイプのサブタイプである必要があります。