6

特定の列が null である列のみを選択するかどうかを判断するために、SQL クエリに何かを渡すことができるようにしたいと考えています。バインドされた変数を使用する代わりにクエリ文字列を作成するだけの場合は、次のようにします。

if ($search_undeleted_only)
{
    $sqlString .= " AND deleted_on IS NULL";
}

しかし、バインドされたクエリを使用したいです。これが最善の方法でしょうか?

my $stmt = $dbh->prepare(...
    "AND (? = 0 OR deleted_on IS NULL) ");
$stmt->execute($search_undeleted_only);
4

3 に答える 3

4

はい; 関連するトリックは、X 個の潜在的なフィルター (オプションのフィルターもあります) がある場合、テンプレート" AND ( ?=-1 OR some_field = ? ) "に を指定し、execute 呼び出しをラップして 2 番目の ? をすべてバインドする特別な関数を作成することです。(この場合、-1 は「このフィルターを無視する」ことを意味する特別な値です)。

Paul Tomblin からの更新: 回答を編集して、コメントからの提案を含めました。

于 2009-01-11T21:00:10.747 に答える
2

条件を呼び出すために、ブール式の短絡セマンティクスに依存していますIS NULLか? それはうまくいくようです。

興味深い点の 1 つは、1 = 0パラメーターを持たないような定数式は、クエリ オプティマイザーによって除外される必要があることです。この場合、オプティマイザーは式が定数であるtruefalse実行時までわからないため、因数分解できないことを意味します。すべての行の式を評価する必要があります。

したがって、パラメータ化されていない定数式を使用した場合にかかるコストと比較して、クエリにわずかなコストが追加されると想定できます。

OR次に、 with式を組み合わせるIS NULLことも、オプティマイザーに影響を与える可能性があります。のインデックスの恩恵を受けられないと判断するかもしれませんがdeleted_on、より単純な式ではそうなるでしょう。これは、使用している RDBMS の実装と、データベース内の値の分布によって異なります。

于 2009-01-11T21:07:26.720 に答える
1

それは合理的なアプローチだと思います。これは通常のフィルター パターンにうまく従い、優れたパフォーマンスを発揮するはずです。

于 2009-01-11T21:00:31.663 に答える