2012-02-03 92 views
0

我有一個像下面那個從另一個選擇減去。我遇到的問題是,如果第二個SELECT(要執行minus操作的那個)返回NULL,則即使第一個查詢具有值,完整查詢也會返回NULL。看起來像MySQL認爲1-NULL = NULL。我怎樣才能解決這個問題?sql選擇 - 另一個選擇與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) 
+0

這不僅僅是MySQL的包裹「內部」 SQL那怎麼NULL被定義爲表現 - 時期。 – MatBailie 2012-02-03 13:45:10

+0

@Dems:看看'1-0 = 0'如何被認爲是一個普遍的事實,但我不認爲'1-NULL = NULL'可以這麼說。相反,它是由SQL標準定義並由mySQL實現的。 **我的意思是鬆散! – onedaywhen 2012-02-03 14:52:37

+0

@onedaywhen - 除NULL不是純粹的SQL概念。這是超越的。 – MatBailie 2012-02-03 15:19:50

回答

1

也許你可以用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

:-)它工作。非常感謝。 – 2012-02-03 14:24:27

0

對null做任何事情都會返回null。如果使用COALESCE或IFNULL爲空,則需要定義要發生的情況。 檢查http://www.w3schools.com/sql/sql_isnull.asp爲例。

+0

「對null執行任何操作返回null」 - NULL NULL IS NULL計算結果爲TRUE。 – onedaywhen 2012-02-03 14:58:34

0

似乎像MySQL認爲1-NULL=NULL

是的;這是正確的。 「一」減「未知」是「未知」。如果您希望將第二個子查詢的NULL視爲0,那麼您需要將其包裝在the COALESCE operator的調用中:將(SELECT ...)更改爲COALESCE((SELECT ...), 0)。這甚至不僅僅是SQL - -