sql select - другой выбор с NULL возвращает только NULL - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть такой, как ниже, который делает минус от другого выбора. У меня проблема в том, что если второй SELECT (тот, с которым нужно работать минус) возвращает NULL, полный запрос возвращает NULL, даже если первый запрос имеет значения. Похоже, MySQL думает 1-NULL = NULL. Как я могу это исправить?

SELECT round(sum(iv.`amount`)) - 
(
 SELECT round(sum(pay.`amount`)) amountSum

     FROM invoice iv
    LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID 
    LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
    LEFT JOIN Payment pay ON (pay.`invoiceID`=iv.`invoiceID`)
     WHERE 
        (iv.invoiceStateID = 2 OR iv.invoiceStateID = 3) 
     AND 
    (ivf.`invoiceFactoringProcessID` = 7)
     AND     (pay.`paymentMethodID` = 1 OR pay.`paymentMethodID` = 2)
     AND systemuser.`groupID` = 1 
     AND iv.`disabled` <> 1 
     AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) AND date_add(now(), INTERVAL - 21 DAY)

)
    FROM invoice iv
    LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID 
        LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
    WHERE 
    (iv.invoiceStateID = 2 OR iv.invoiceStateID = 3)
        AND 
    (ivf.`invoiceFactoringProcessID` = 7 or ivf.`invoiceFactoringProcessID`)
    AND systemuser.`groupID` = 1 
    AND iv.`disabled` <> 1   /* ta bort de som är inaktiva*/    
    AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) AND date_add(now(), INTERVAL - 21 DAY)

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

возможно, вы можете обернуть "внутренний" SQL с IFNULL

SELECT round(sum(iv.`amount`)) - 
IFNULL((
 SELECT round(sum(pay.`amount`)) amountSum
 FROM invoice iv
 LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID 
 LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
 LEFT JOIN Payment pay ON (pay.`invoiceID`=iv.`invoiceID`)
 WHERE 
    (iv.invoiceStateID = 2 OR iv.invoiceStateID = 3) 
 AND 
    (ivf.`invoiceFactoringProcessID` = 7)
 AND     (pay.`paymentMethodID` = 1 OR pay.`paymentMethodID` = 2)
 AND systemuser.`groupID` = 1 
 AND iv.`disabled` <> 1 
 AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) 
 AND date_add(now(), INTERVAL - 21 DAY)
),0)

FROM invoice iv
LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID 
    LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
WHERE 
(iv.invoiceStateID = 2 OR iv.invoiceStateID = 3)
    AND 
(ivf.`invoiceFactoringProcessID` = 7 or ivf.`invoiceFactoringProcessID`)
AND systemuser.`groupID` = 1 
AND iv.`disabled` <> 1   /* ta bort de som är inaktiva*/    
AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) AND date_add(now(), INTERVAL - 21 DAY)
0 голосов
/ 03 февраля 2012

Похоже, что MySQL думает 1-NULL=NULL.

Да;и это правильно.«Один» минус «неизвестно» - это «неизвестно».Если вы хотите, чтобы второй подзапрос NULL обрабатывался как 0, вам нужно заключить его в вызов оператора COALESCE : измените (SELECT ...) на COALESCE((SELECT ...), 0).

0 голосов
/ 03 февраля 2012

Если сделать что-либо с нулем, возвращается ноль.Вы должны определить, что вы хотите, чтобы происходило, если оно пустое, используя COALESCE или IFNULLПроверьте http://www.w3schools.com/sql/sql_isnull.asp для примера.

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