そのため、4 つのメニュー選択 (product、location、courseType、および category) があり、すべて null にすることができます (JSF を使用してプログラムされていますが、SQL の質問であるため、この質問には関係ありません)。
メニューを選択すると、マネージド Bean にユーザーが選択した変数が送信され、準備済みステートメントを使用して、ユーザーが選択したメニューからの情報 (存在する場合) を使用してデータベース テーブルが検索されます。
ユーザーがメニュー項目を null のままにすると、すべてを検索する必要があります。
ユーザーがメニュー項目の 1 つ、2 つ、または 3 つを情報とともに残し、他の 1 つを null のままにした場合、それに応じて検索する必要があります。
私の問題は、Bean 内の一連の if/then ステートメントを、すべての適切な sql ステートメントに関連付けずにどのように行うかです。
または、これをすべて行うことができるより良いSQLステートメントが1つありますか?
Java で準備済みステートメントを使用しています。
私はこれを試しました:
if (product != null && location != null && courseType != null && category != null) {
pstmt = conn.prepareStatement("select * FROM Courses WHERE "
+ "product = ? "
+ "and location = ? "
+ "and courseType = ? "
+ "and category = ?");
pstmt.setString(1, product);
pstmt.setString(2, location);
pstmt.setString(3, courseType);
pstmt.setString(4, category);
} else if (product == null && location != null && courseType != null && category != null) {
pstmt = conn.prepareStatement("select * FROM Courses WHERE "
+ "location = ? "
+ "and courseType = ? "
+ "and category = ?");
pstmt.setString(1, location);
pstmt.setString(2, courseType);
pstmt.setString(3, category);
}
などなどですが、1がnullで他がそうではない場合ごとに、これを16回行う必要がありますか? よりスマートな方法が必要です (SQL ステートメントを 1 つ使用するか、Java の if/then ステートメントをいくつか使用するかのいずれか)。
ルイージ・メンドーサのおかげで更新!私のコードは次のように機能します:
pstmt = conn.prepareStatement("select * FROM Courses WHERE "
+ "(product = ? or ? is null) "
+ "and (location = ? or ? is null) "
+ "and (courseType = ? or ? is null)"
+ "and (category = ? or ? is null)");
pstmt.setString(1, product);
pstmt.setString(2, product);
pstmt.setString(3, location);
pstmt.setString(4, location);
pstmt.setString(5, courseType);
pstmt.setString(6, courseType);
pstmt.setString(7, category);
pstmt.setString(8, category);
rset = pstmt.executeQuery();
更新ええ、別のmysqlデータベース(おそらく別のバージョンなど)では、 is null の代わりに = "" を使用する必要がありました