前のトピック: Where 節

次のトピック: Webサービス メソッド

IN 節

IN 節には特別な説明が必要です。 2 つの構文形式を以下に示します。

SREL_attr_name.subq_WHERE_attr[.attr] IN ( value1 [, value2 [,…]] )
SREL_attr_name.[subq_SELECT_attr]LIST_name.subq_WHERE_attr IN (value1, [,value2 [,…]] )

IN 節の左側は、クエリ対象のテーブルの SREL タイプの属性で始める必要があり、上記の例では SREL_attr_name となっています。 subq_WHERE_attr は外部オブジェクトの属性で、それ自体が別の SREL ポインタである場合があります。

たとえば、リクエスト(「cr」)オブジェクトに対するクエリは以下のようにコード化できます。

category.sym IN ('Soft%', 'Email')

これは擬似 SQL で表すと以下のようになります。

SELECT … FROM cr WHERE cr.category IN (SELECT persistent_id FROM pcat WHERE sym LIKE 'Soft%' OR sym = 'Email')

前述のサブクエリでは、「pcat」は cr.category が指すオブジェクト名です。

IN 節の 2 つ目の形式は、BREL リストを検索できます。 たとえば、特定のグループのアナリストに割り当てられたすべてのリクエストを検索する場合は、以下のようになります。

assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’)

IN 節の最初の部分(assignee)は、cr オブジェクトの SREL(外部キー)であり、cnt オブジェクトを指しています。 次の group_list は cnt オブジェクトの属性で、連絡先が属しているグループを表す cnt オブジェクトのリストです。 最後の部分(group)は、IN サブクエリにおいて、Where 節の最初の部分を形成します。 ‘U’913B485771E1B347968E530276916387 は、group に一致する外部キーの値です。 サブクエリの戻り値は [member] によって指定されます。 これは擬似 SQL ステートメントで表すと以下のようになります。

SELECT … FROM cr WHERE cr.assignee IN (SELECT member from grpmem WHERE group = U’913B485771E1B347968E530276916387’)

複数のオブジェクトと一致する複数の外部キーを指定するには、以下のようにカンマ区切りリストを使用します。

assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’, U’913B485771E1B347968E530276916300’)

このように IN 節を使用する場合に、ドット記法を拡張することはできません。たとえば、以下の指定は無効です。

assignee.[member]group_list.group.last_name IN ('Account Center')

INを使用する理由の1つは、直積を避けるためです。 たとえば、以下のようなクエリの結果は直積となり、効率が非常に悪くなります。

assignee.last_name LIKE 'MIS%' OR group.last_name LIKE 'MIS%'

IN を使用したクエリは以下のようにコード化できます。

assignee.last_name IN 'MIS%' OR group.last_name IN 'MIS%'

このクエリでは直積が作成されないどころか、結合さえも行われません。

注: IN の右側にある値のリストを囲むために通常使用するかっこは、リスト内の値が 1 つのみの場合は省略することができます。 同様に、クエリを変換して結合を避ける必要があります。以下に変換前と変換後の例を示します。

assignee.last_name LIKE ‘Smith’

変換後

assignee = U’913B485771E1B347968E530276916387’

このようにすると、多少明確さに欠けますが、結合を避けることができます。 IN を使用すれば、上記のクエリを以下のように記述できます。この場合、最初の例の明確さと、2 つ目の例の効率の良さを保つことができます。

assignee.last_name IN ‘Smith’

「NOT」キーワードは、「NOT IN」のように、IN と組み合わせて使用することはできません。