検索条件

search-condition (検索条件) は、特定の値、行、またはグループについて「真」、「偽」、または「不明」となる条件を指定します。検索条件としては、ブール・タイプの列、値、またはリテラルも可能です。

search-condition
構文図を読む構文図をスキップするNOTpredicateSELECTIVITYnumeric-constantANDORNOTpredicateSELECTIVITYnumeric-constant

検索条件の結果は、指定した各述部の結果に、 指定した論理演算子 (AND、 OR、NOT) を適用することによって求められます。 論理演算子の指定がない場合、 検索条件の結果は指定された述部の結果になります。

AND と OR は、表 1 で定義されています。 表中の P と Q は任意の述部です。

表 1. AND と OR の真理値表
P Q P AND Q P OR Q
不明 不明
不明 不明
不明 不明
不明 不明
不明 不明 不明 不明

NOT(true) は偽、NOT(false) は真、NOT(unknown) は不明です。

括弧の中の検索条件が最初に評価されます。 評価の順序を括弧によって指定していない場合、 NOT が AND の前に適用され、AND が OR の前に適用されます。 同じ優先順位の演算子が評価される順序は、 検索条件の最適化を図るために定義されていません。

図 1. 検索条件の評価順序
検索条件の評価順序
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 演算子) がない場合

次の照会では、WHERE 節に 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 列で定義した索引のみを利用します。