Выбор значения в 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
Другие вопросы по тегам