Это все, что связано с приоритетом операторов.Допустим, вы ищете «Джеймс». Фактический код SQL, который вы пытаетесь выполнить, таков:
Select ID,First_Name,[M.I],Last_Name from User_Table
where Role_ID = 3 AND Last_Name LIKE 'James'
or First_Name LIKE 'James'
Теперь из-за приоритета операторов SQL , ГДЕраздел обрабатывается как:
WHERE (Role_ID = 3 AND Last_Name LIKE 'James')
OR (First_Name LIKE 'James')
Таким образом, вы получите всех врачей, чьи фамилии «Джеймс», и всех (включая медсестер), чьи имена «Джеймс».И когда ваше поле поиска будет пустым, вы получите всех, чьи имена LIKE ''
, то есть все.
Чтобы бит Role_ID = 3
применялся в обоих случаях, вам просто нужны скобкивот так:
Select ID,First_Name,[M.I],Last_Name from User_Table
where Role_ID = 3 AND (Last_Name LIKE 'James'
or First_Name LIKE 'James')
Итак, ваш код будет выглядеть так:
String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
"where Role_ID = 3 AND ( Last_Name LIKE '"+like+"%' or First_Name LIKE '"+like+"%')";
Однако ...
Вы также делаете что-то действительно плохое здесь.Вы настраиваете себя на то, что называется атакой SQL-инъекции.Прочтите об этом и о том, как вы должны предоставить ?
в SQL, где вы хотите указать свое значение, а затем заменить его на что-то вроде setString()
после того, как вы вызвали conn.prepareStatement(sql)
.Это очень, очень важно.
В целом, вы, вероятно, получите что-то вроде:
String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
"where Role_ID = 3 AND (Last_Name LIKE ? or First_Name LIKE ?)";
pst = conn.prepareStatement(sql);
pst.setString(1, like);
pst.setString(2, like);
rs = pst.executeQuery();