検索条件
search-condition (検索条件) は、特定の値、行、またはグループについて「真」、「偽」、または「不明」となる条件を指定します。検索条件としては、ブール・タイプの列、値、またはリテラルも可能です。
検索条件の結果は、指定した各述部の結果に、 指定した論理演算子 (AND、 OR、NOT) を適用することによって求められます。 論理演算子の指定がない場合、 検索条件の結果は指定された述部の結果になります。
AND と OR は、表 1 で定義されています。 表中の P と Q は任意の述部です。
| P | Q | P AND Q | P OR Q |
|---|---|---|---|
| 真 | 真 | 真 | 真 |
| 真 | 偽 | 偽 | 真 |
| 真 | 不明 | 不明 | 真 |
| 偽 | 真 | 偽 | 真 |
| 偽 | 偽 | 偽 | 偽 |
| 偽 | 不明 | 偽 | 不明 |
| 不明 | 真 | 不明 | 真 |
| 不明 | 偽 | 偽 | 不明 |
| 不明 | 不明 | 不明 | 不明 |
NOT(true) は偽、NOT(false) は真、NOT(unknown) は不明です。
括弧の中の検索条件が最初に評価されます。 評価の順序を括弧によって指定していない場合、 NOT が AND の前に適用され、AND が OR の前に適用されます。 同じ優先順位の演算子が評価される順序は、 検索条件の最適化を図るために定義されていません。

- SELECTIVITY numeric-constant
-
SELECTIVITY 節は、述部に指定する選択の予想パーセントを示すために使用します。
SELECTIVITY は、以下の述部に対して指定できます。
- ユーザー定義の述部。Db2_SELECTIVITY 照会コンパイラーのレジストリー変数設定に関係なく指定可能です。
- 少なくとも 1 つの式にホスト変数またはパラメーター・マーカーが含まれる基本述部。 このタイプの述部に対する SELECTIVITY の指定が適用されるのは、Db2_SELECTIVITY 照会コンパイラーのレジストリー変数が YES に設定されているときのみです。
- 照会コンパイラーのレジストリー変数 DB2_SELECTIVITY が ALL に設定されている場合は、任意の述部。
ユーザー定義述部とは、述部が指定されているコンテキストの中で、 ユーザー定義関数呼び出しで構成される述部のことです。 これは、CREATE FUNCTION の PREDICATES 節で指定した述部と一致します。 例えば、PREDICATES WHEN=1... で関数myfunctionが定義される場合、SELECTIVITY を次のように使用できます。SELECT * FROM STORES WHERE myfunction(parm,parm) = 1 SELECTIVITY 0.004この SELECTIVITY の値は、 0 から 1 の範囲の数値リテラル値でなければなりません (SQLSTATE 42615)。 SELECTIVITY を指定しない場合、デフォルト値は 0.01 になります (つまり、 ユーザー定義述部は、表内にあるすべての行の 1% を除いて、 すべての行をフィルターで除外することになります)。 SYSSTAT.ROUTINES ビュー内の SELECTIVITY 列を更新すれば、 どの関数の SELECTIVITY デフォルトでも変更することができます。 ユーザー定義述部以外の述部に SELECTIVITY 節を指定すると、エラーが戻されます (SQLSTATE 428E5)。
ユーザー定義関数 (UDF) はユーザー定義述部として使うことができるので、 以下の場合、索引を利用するときにも使える可能性があります。- CREATE FUNCTION ステートメントに述部の指定がある場合
- WHERE 節で UDF が呼び出されていて、 述部を指定したときの指定方法で (文法的に) 比較される場合
- 「否定」(NOT 演算子) がない場合
例
within UDF が指定されていて、
3 つの条件がすべて満たされているので、ユーザー定義述部であると見なされます。
SELECT *
FROM customers
WHERE within(location, :sanJose) = 1 SELECTIVITY 0.2within を指定しても、
「否定」が入っているため、索引を利用できません。
これは、ユーザー定義述部とは見なされません。
SELECT *
FROM customers
WHERE NOT(within(location, :sanJose) = 1) SELECTIVITY 0.3 SELECT *
FROM customers, stores
WHERE distance(customers.loc, stores.loc) <
CityRadius(stores.loc) SELECTIVITY 0.02上記の照会では、WHERE 節の述部は、ユーザー定義述部であると見なされます。 CityRadius による結果は、範囲を生成する関数に対する検索引数として使われます。
しかし、CityRadius による結果が、 範囲を生成する関数として使われるため、上記のユーザー定義述部では、stores.loc 列に定義された索引拡張を利用することができません。 したがって、UDF は customers.loc 列で定義した索引のみを利用します。
