検索条件

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

search-condition
Read syntax diagramSkip visual syntax diagramNOTpredicateSELECTIVITYnumeric-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 数値定数
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 演算子) がない場合

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