2014-12-01 9 views
0

У меня есть этот SQL-запрос:SQL Lite - SUM возвращает нуль вместо значения 0 (ноль)

var sqlQuery = 
        "SELECT '"+dateRanges[ic].DATE_FROM+"' as DATE_FROM, "+ 
        " '"+dateRanges[ic].DATE_TO+"' as DATE_TO, "+ 
        " COUNT(*) AS DIALS_CNT, "+ 
        " SUM(CASE WHEN dc.call_result = '"+CALL_RESULT_STATE_APPT+"' THEN 1 ELSE 0 END) AS '"+APPT_CNT+"', "+ 
        " SUM(CASE WHEN dc.call_result = '"+CALL_RESULT_STATE_CONV_NO_APPT+"' THEN 1 ELSE 0 END) AS '"+CONVERS_CNT+"' , "+ 
        " SUM(CASE WHEN dc.call_result = '"+CALL_RESULT_STATE_CANNOT_REACH+"' THEN 1 ELSE 0 END) AS '"+CANNOT_REACH_CNT+"' "+ 
        " FROM "+DIALED_CALLS_TABLE+" dc "+ 
        " WHERE dc.date BETWEEN '"+dateRanges[ic].DATE_FROM+"' AND '"+dateRanges[ic].DATE_TO+"';"; 

Проблема заключается в том, что если сумма значений равна нулю результат, содержащий нулевое значение. Я думал, что могу решить его, используя THEN 1 ELSE 0 END, но он не работает.

Как я могу решить эту проблему, чтобы получить результат с нулями вместо нуля?

Спасибо за любую помощь.

+0

Просто спрашиваю .. Как вы обработки запроса? Просто интересно, достаточно ли безопасно создавать запрос в javascript, который может легко манипулировать клиентом, поэтому он может быть в простой простой в использовании инъекции. – briosheje

+0

Это мобильное приложение Cordova. – redrom

+0

О, никогда об этом не слышал. В любом случае, возможно, добавьте это в описание, кто-то может с уверенностью помочь вам в этом, зная, что вы используете такую ​​инфраструктуру, обычно небезопасно создавать SQL-запросы с помощью самого javascript. – briosheje

ответ

-1

Я думаю, что если некоторые из ваших начальных значений равны нулю, то даже case/else не будет работать (ни один ни один не равен или не равен чему-либо). Попробуйте поместить значение по умолчанию, пустое значение для нулей, используя IFNULL.

... 
    " SUM(CASE WHEN IFNULL(dc.call_result,some_default_value) = '"+CALL_RESULT_STATE_APPT+"' THEN 1 ELSE 0 END) AS '"+APPT_CNT+"', "+ 
... 
+0

Это неправильно; NULL в предложении WHEN интерпретируются как ложные. –

0

SUM возвращает NULL, когда он не получает какое-либо значение, чтобы начать с, то есть, когда ваш ИНЕКЕ не соответствует ни одной строки.

Если вы можете жить с результатом, являющимся числом с плавающей запятой, замените SUM на TOTAL. В противном случае, вы можете положить IFNULL вокруг всей суммы:

SELECT ... IFNULL(SUM(CASE ... END), 0) FROM ... 
Смежные вопросы