検索条件
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 数値定数
- SELECTIVITY 節は、述部に指定する選択の予想パーセントを示すために使用します。 SELECTIVITY は、以下の述部に対して指定できます。
- ユーザー定義の述部。DB2_SELECTIVITY 照会コンパイラーのレジストリー変数設定に関係なく指定可能です。
- 少なくとも 1 つの式にホスト変数またはパラメーター・マーカーが含まれる基本述部。 このタイプの述部に対する SELECTIVITY の指定が適用されるのは、DB2_SELECTIVITY 照会コンパイラーのレジストリー変数が YES に設定されているときのみです。
- DB2_SELECTIVITY 照会コンパイラーのレジストリー変数が ALL に設定されている場合の述部 (REGEXP_LIKE を除く)。 以下の述部では SELECTIVITY 節を使用できますが、値は無視されます。
- 基本述部 (行値式を使用)
- BETWEEN 述部
このような場合は、述部を複数の基本述部に書き直し、それぞれに別個の SELECTIVITY 節を指定する必要があります。 述部が照会再書き込みルールによって変更される場合、SELECTIVITY 値は適用されません。
ユーザー定義述部とは、述部が指定されているコンテキストの中で、 ユーザー定義関数呼び出しで構成される述部のことです。 これは、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.2
within
を指定しても、「否定」が入っているため、索引を利用できません。これは、ユーザー定義述部とは見なされません。 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 列で定義した索引のみを利用します。