4

たとえば、私はステートメントを持っています

"SELECT * FROM Reports WHERE StartDate >= ? WHERE EndDate <= ? AND Performer = ?"

ただし、Webページの一部の入力フィールドが入力されていない場合があるため、この条件を考慮に入れる必要はありません。つまり、開始日が入力されていないため、ステートメントは次のようになります。

"SELECT * FROM Reports WHERE EndDate <= ? AND Performer = ?"

3つの異なる条件があります。それで、タスクを実行するために8つの異なるステートメントとDAOメソッドを作成する必要がありますか?本当に?多分他の解決策がありますか?

編集:私はMySQLを使用しています/

4

3 に答える 3

9

null に対応するように SQL を変更します。どのデータベースを使用しているか教えていただけないので、「普通の」SQL を使用します。

SELECT * 
FROM Reports
WHERE (EndDate <= ? OR ? is null)
AND (Performer = ? OR ? is null)

パラメーターをそれぞれ 2 回渡します。

もう 1 つの選択肢は、パラメーターが null であることに基づいて SQL を変更することです (たとえばPerformer = ?、where 句を省略します) が、これには多くのコードとテストが必要になる可能性があります。適応可能な SQL を使用し、パフォーマンスが悪い場合は、より高度なものを試します。

于 2012-04-15T10:30:02.723 に答える
0

You dont need 8 different statements. You can build the query using if statements. For e.g.,

String query = "SELECT * FROM Reports where true";
if(startDate != null)
  query = query + " and startDate <= ?";
if(endDate != null)
  query = query + " and endDate <= ?";
if(performer != null)
  query = query + " and performer = ?";

Hope it works for you.

于 2012-04-15T10:37:26.480 に答える
0

プリペアド ステートメントは、単独で条件を除外することはできません。不必要な条件を回避するために構築されるクエリ。

次のコードを使用して SQL を生成できます。

StringBuilder whereClause = new StringBuilder();
String and = "";

if(EndDate == null || EndDate.length == 0)
{
    whereClause.append(your condition);
    and = " and";
}

if(StartDate == null || StartDate.length == 0)
{
    whereClause.append(and).append(your condition);
    and = " and";
}

if(Performer == null || Performer.length == 0)
{
    whereClause.append(and).append(your condition);
}

生成したクエリに基づいて、パラメータを準備済みステートメントに設定する必要があります。

于 2012-04-15T10:43:35.403 に答える