Выбор значения в SQL-запросе против (Java) кода
Мне нужно выбрать одно из трех значений целого числа, используя значение столбца в обнуляемом столбце таблицы.
Существует как минимум два подхода: 1) использовать SQL для выполнения всей работы: тестировать нулевые значения и выбирать между другими значениями или 2) читать значение и использовать код - в этом случае Java- для выбора.
Какой из них "лучше", т.е. легче понять и легче обслуживать? Есть ли у вас какой-либо другой показатель использования?
В качестве примера у меня есть следующий код:
// If id is equal to:
// -1, then make v = 1
// null, then make v = 2
// in any other case, make v = 3
// Option 1:
int v;
String query = "SELECT CASE min(Id) WHEN NULL THEN 2 WHEN -1 THEN 1 ELSE 3 END AS Id"
+ "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)";
ResultSet rs = // execute query
if (rs.next()) {
v = rs.getInt("Id");
} else {
// TODO something went *very* wrong...
}
// Option 2:
int v;
String query = "SELECT CASE min(Id) Id"
+ "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)";
ResultSet rs = // execute query
if (rs.next()) {
final int id = rs.getInt("Id");
if (rs.wasNull()) {
v = 2;
} else if (id == -1) {
v = 1;
} else {
v = 3;
}
} else {
// TODO something went *very* wrong...
}
2 ответа
Я бы пошел на SQL, если запрос не очень сложен (значит, выполняется в разумные сроки). Если запрос 10 минут, лучше попробуйте Java. Но я всегда предпочел бы подход SQL, если БД может сделать эту работу за меня.
(просто копия моего комментария)
Я бы сказал, что SQL сделает всю работу. Это довольно тривиально и не потребляет процессорного времени, и SQL все равно придется загружать соответствующую информацию в память, поэтому она уже готова для обработки. Делая это на стороне приложения, в некоторой степени кажется, что вам нужно "повторно подготовить" данные для анализа, и (imho) код Java кажется более сложным для чтения и понимания.
Обратите внимание, что в вашем коде SQL есть небольшой недостаток, вы не можете использовать WHEN NULL
таким образом, в заявлении дела. Вы хотели бы что-то вроде
...case
when min(Id) is null then 2
when min(Id) = -1 then 1
else 3
end