Mysql sql select-另一个带有NULL的select仅返回NULL

Mysql sql select-另一个带有NULL的select仅返回NULL,mysql,sql,Mysql,Sql,我有一个类似下面的,从另一个选择中减去的。我遇到的问题是,如果第二个选择要执行减号的查询返回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 i

我有一个类似下面的,从另一个选择中减去的。我遇到的问题是,如果第二个选择要执行减号的查询返回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)

使用null执行任何操作都会返回null。您需要使用COALESCE或IFNULL定义如果为null,您希望发生什么。 请查看示例

看起来MySQL认为1-NULL=NULL


对,;这是正确的。一减去未知就是未知。如果希望第二个子查询的NULL被视为0,则需要将其包装在调用中:change SELECT。。。要合并选择…,0。

也许可以用IFNULL包装内部sql

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)

这不仅仅是MySQL-这甚至不仅仅是SQL-这就是NULL的定义行为-句号。@Dems:看看1-0=0如何被认为是一个普遍真理,但我不认为1-NULL=NULL也是如此。相反,它是由SQL标准定义的**,由mySQL实现。**我是说随便@onedaywhen-除了NULL不是一个纯粹的SQL概念。这已经超越了它。@Dems:你对此有引用吗?使用null做任何事情都会返回null-null IS null的计算结果为TRUE。