0

、、、、の4 つのテキスト フィールドがFirstNameありLastNameます。ユーザーがテキスト フィールドにデータを入力して、学生の記録を検索できるようにします。ユーザーが送信ボタンを押すと、要求した生徒の記録に対応する表が表示されます。したがって、たとえば、ユーザーがテキスト フィールドに入力した場合、コンピューター サイエンス学部のすべての学生を表示する必要があります。IDdepartmentcomputerSciencedepartment

したがって、私の SQL 選択ステートメントは、実行時にそれを実行できるはずです。

次のような準備済みステートメントを使用しています。

PreparedStatement pre = conn.prepareStatement("select ID,FirstName,LastName,Dept from student where ID = ? or FirstName = ? or lastName = ? or Dept = ?");

ただし、これは ID が入力された場合にのみ結果を表示します。しかし、誰かが姓に「Mark」と入力し、他のすべてのテキスト フィールドを空白のままにした場合、データベースに姓が Mark である学生がいるにもかかわらず、このクエリは何も表示しません。

誰か私をここに案内してもらえますか?

4

2 に答える 2

3

以下のように動的クエリ文字列を使用します (少なくとも 1 つの基準が存在すると仮定します)。

   String query = "select ID,FirstName,LastName,Dept from student where ";
   String delim = "";
   if(firstName != null){
      query+ = delim + "FirstName = '"+firstName+"'";
      delim = " AND ";
   }
   if(lastName != null){
      query+ = delim + "LastName = '"+lastName +"'";
      delim = " AND ";
   }
   .........
   .........
   PreparedStatement pre = conn.prepareStatement(query);

お役に立てれば!

于 2012-11-10T00:54:49.060 に答える
0

他のコメントと回答で述べたように、動的アプローチを使用できます。ただし、この場合、列自体は実行時に追加されないため、別のアプローチも使用できます。ステートメントを次のように変更します。

PreparedStatement pre = conn.prepareStatement("select ID,FirstName,LastName,Dept from student where ID = IFNULL(?,ID) and FirstName = IFNULL(?,FirstName) AND lastName = IFNULL(?,lastName) and Dept = IFNULL(?,Dept)");

「または」の代わりに「および」に変更されたすべての条件に注意してください。何が起こっているのかを理解するには: ここで "Dept = IFNULL(?,Dept)" の例を見てみましょう。渡す値が null の場合 (ユーザーが部門を選択していない場合)、IFNULL(?,Dept) は、 Dept = IFNULL(?,Dept) は、Dept がそれ自体と等しくなるため、db の現在の行と条件全体が true と評価されます。それ以外の場合、値を送信すると、IFNULL(?,Dept) はその値に評価され、その行の部門がその値と等しい場合にのみ行が選択されます。同じことが他の部分にも当てはまり、それが「and」が使用される理由です。実際には、各条件は、値が存在する場合、行が返されるためには同じ値を持っている必要があることを確認します。それ以外の場合、条件は行をブロックしません!!!

最後の注意として、ユーザーがフィールドでデータを選択しない場合は、そのフィールドの値として NULL をデータベースに渡す必要があります (空白に注意してください)。および IF フィールド ID が数値の場合、上記の部分を次のように変更する必要があります (また、ユーザーが ID を選択しない場合は必ず 0 を送信してください): ID = IFNULL(NULLIF(?,0) ,ID)

PreparedStatement pre = conn.prepareStatement("select ID,FirstName,LastName,Dept from student where ID = IFNULL(NULLIF(?,0),ID) and FirstName = IFNULL(?,FirstName) AND lastName = IFNULL(?,lastName) and Dept = IFNULL(?,Dept)");
于 2012-11-10T01:28:25.440 に答える