Запрос Sqlite возвращает пустой курсор вместо 0 - PullRequest
0 голосов
/ 07 июля 2019

У меня есть запрос, который должен вернуть итоговое значение Income - total expense за указанную дату

db.rawQuery("select (totIncome-totExpense) from  " +
   "((select coalesce(sum(amount),0) as totIncome from transaction_table where type=0 and date like '"+ ke+"'), " +
   "(select COALESCE(sum(amount),0) as totExpense from transaction_table where type=1 and date like '"+ ke+"'))",null);

Но если для данной даты нет записей для type=0, запрос возвращает вместо этого пустой курсор-totExpense.

1 Ответ

0 голосов
/ 07 июля 2019

Вы можете выполнить условное агрегирование с помощью sum(case...):

db.rawQuery(
  "select coalesce(sum(case type when 0 then amount else 0 end) - sum(case type when 1 then amount else 0 end), 0) as result from transaction_table where date like ?",
  new String[] {ke}
);

Таким образом, суммы рассчитываются только с одним сканированием таблицы.Функция coalesce() необходима только в том случае, если в таблице на эту дату нет строк.Я также вынул из запроса дату ke и передал ей более безопасный параметр.Возможно, вместо like вы можете использовать =, если ke - просто дата и не содержит подстановочных знаков, таких как % или _.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...