search-condition |--+------+---+-predicate--+--------------------------------+-+-> '-NOT--' | '-SELECTIVITY--numeric-constant--' | '-(search-condition)----------------------------' .--------------------------------------------------------------------------------. V | >--------+--------------------------------------------------------------------------+--+> '--+-AND-+---+------+---+-predicate--+--------------------------------+-+--' '-OR--' '-NOT--' | '-SELECTIVITY--numeric-constant--' | '-(search-condition)----------------------------' >---------------------------------------------------------------|
search-condition (探索条件) は、 特定の行について「真」、「偽」、または「不定」となる条件を指定します。
探索条件の結果は、指定した各述部の結果に、 指定した論理演算子 (AND、 OR、NOT) を適用することによって求められます。
論理演算子の指定がない場合、 探索条件の結果は指定された述部の結果になります。
AND と OR は、表 14 で定義されています。
表中の P と Q は任意の述部です。
P | Q | P AND Q | P OR Q |
---|---|---|---|
真 | 真 | 真 | 真 |
真 | 偽 | 偽 | 真 |
真 | 不定 | 不定 | 真 |
偽 | 真 | 偽 | 真 |
偽 | 偽 | 偽 | 偽 |
偽 | 不定 | 偽 | 不定 |
不定 | 真 | 不定 | 真 |
不定 | 偽 | 偽 | 不定 |
不定 | 不定 | 不定 | 不定 |
NOT(true) は偽、NOT(false) は真、NOT(unknown) は不定です。
括弧の中の探索条件が最初に評価されます。 評価の順序を括弧によって指定していない場合、 NOT が AND の前に適用され、AND が OR の前に適用されます。
同じ優先順位の演算子が評価される順序は、 探索条件の最適化を図るために定義されていません。
ユーザー定義述部とは、述部が指定されている文脈の中で、 ユーザー定義関数呼び出しで構成される述部のことです。 これは、CREATE FUNCTION の PREDICATES 文節で指定した述部と一致します。 たとえば、PREDICATES WHEN=1... で関数 foo が定義される場合、 SELECTIVITY を次のように使うことができます。
SELECT * FROM STORES WHERE foo(parm,parm) = 1 SELECTIVITY 0.004
この SELECTIVITY の値は、 0 〜 1 の範囲の数値リテラル値でなければなりません (SQLSTATE 42615)。 SELECTIVITY を指定しない場合、省略時値は 0.01 になります (つまり、 ユーザー定義述部は、表に含まれるすべての行の 1 パーセントを除いて、 すべての行をフィルターではじくことになります)。 この SELECTIVITY 省略時値については、 SYSSTAT.FUNCTIONS 視点の SELECTIVITY 列を更新することにより、 特定の関数用に変更することができます。 ユーザー定義述部以外の述部に SELECTIVITY 文節を指定すると、エラーが戻されます (SQLSTATE 428E5)。
ユーザー定義関数 (UDF) はユーザー定義述部として使うことができるので、 以下の場合、索引を利用するときにも使える可能性があります。
次の照会では、WHERE 文節に within UDF が指定されていて、 3 つの条件がすべて満たされているので、ユーザー定義述部であると見なされます。 (within および distance UDF の詳細は、 CREATE FUNCTION (外部スカラー)の『例』の項を参照してください。)
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 列で定義した索引だけを利用します。