2012-04-15 12 views
4

は例えば、私は声明PreparedStatementはWHERE句のいくつかの条件を考慮に入れていませんか?

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

を持っている。しかし、時には、Webページ上の一部の入力フィールドが満たされたので、私は、アカウントにこの条件を取らないために持っていません。すなわち、私はSTARTDATEいっぱいを持っていないので、文は3つの異なる条件があります

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

でなければなりません。だから、私はタスクを達成するために8つの異なるステートメントとDAOメソッドを書かなければならないのですか?本当に?多分、他の解決策がありますか?

編集

私はヌルに対応するためのMySQL/

+0

[この質問の重複](http://stackoverflow.com/q/8277313/248082)。 – nobeh

答えて

8

の変更をあなたのSQLを使用しています。

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

がそれぞれ2回にパラメータを渡す:あなたが使用しているデータベースを語ってくれたしていないので、私は「バニラ」SQLを使用します。

もう1つの選択肢は、パラメータがヌルであることに基づいてSQLを変更することです(たとえば、where句からPerformer = ?を省略すると)が、多くのコードとテストが必要になる可能性があります。私は適応可能なSQLを使用し、それがひどく実行された場合は、となり、はさらに高度なものを試します。

+3

これはうまくいきますが、実行計画が悪くなりがちで、大きな表のパフォーマンスが低下する可能性があります。 – StuartLC

+2

+1最初に簡単な方法で作業し、必要な場合にのみ最適化する –

+0

素晴らしい作品です!ありがとう! – chicout

0

あなたは8つの異なるステートメントを必要としません。 if文を使用してクエリを構築できます。たとえば、

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 = ?"; 

希望します。

0

いいえPreparedステートメントは、単独でコンテンションを除外できません。不必要な条件を回避するように指示されたクエリ。

あなたは、コードを使用して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); 
} 

、あなたに基づいてあなたが準備された文にパラメータを設定する必要があるクエリを生成しました。

関連する問題